Moar whitespace normalization [MDB IGNORE] (#7750)

Co-authored-by: Raeschen <rycoop29@gmail.com>
This commit is contained in:
Drathek
2024-02-16 10:54:47 +01:00
committed by GitHub
co-authored by Raeschen
parent eecf6bbff9
commit 3995338290
1177 changed files with 550902 additions and 550902 deletions
@@ -1,58 +1,58 @@
/datum/species
var/crit_mod = 1
var/vore_belly_default_variant = "H"
var/list/env_traits = list()
var/dirtslip = FALSE
var/photosynthesizing = FALSE
var/grows = FALSE
var/shrinks = FALSE
var/rad_levels = list("safe" = 2.5, "danger_1" = 50, "danger_2" = 75, "danger_3" = 150)
var/rad_removal_mod = 1
var/bite_mod = 1
var/grab_resist_divisor_victims = 1
var/grab_resist_divisor_self = 1
var/grab_power_victims = 0
var/grab_power_self = 0
var/waking_speed = 1
var/mudking = FALSE
var/vanity_base_fit //when shapeshifting using vanity_copy_to, this allows you to have add something so they can go back to their original species fit
// Handles non-standard eyes when using a species that utilizes a custom base icon set.
// Eye data is stored in the head organ, and this needs to be handled specially.
/datum/species/proc/handle_base_eyes(var/mob/living/carbon/human/H, var/custom_base)
if(selects_bodytype && custom_base) // only bother if our src species datum allows bases and one is assigned
var/datum/species/S = GLOB.all_species[custom_base]
//extract default eye data from species datum
var/baseHeadPath = S.has_limbs[BP_HEAD]["path"] //has_limbs is a list of lists
if(!baseHeadPath)
return // exit if we couldn't find a head path from the base.
var/obj/item/organ/external/head/baseHead = new baseHeadPath()
if(!baseHead)
return // exit if we didn't create the base properly
var/obj/item/organ/external/head/targetHead = H.get_organ(BP_HEAD)
if(!targetHead)
return // don't bother if target mob has no head for whatever reason
targetHead.eye_icon = baseHead.eye_icon
targetHead.eye_icon_location = baseHead.eye_icon_location
if(!QDELETED(baseHead) && baseHead)
qdel(baseHead)
return
/datum/species/handle_environment_special(var/mob/living/carbon/human/H)
for(var/datum/trait/env_trait in env_traits)
env_trait.handle_environment_special(H)
return
/datum/species/proc/update_vore_belly_def_variant()
// Determine the actual vore_belly_default_variant, if the base species in the VORE tab is set
switch (base_species)
if("Teshari")
vore_belly_default_variant = "T"
if("Unathi")
vore_belly_default_variant = "L"
/datum/species
var/crit_mod = 1
var/vore_belly_default_variant = "H"
var/list/env_traits = list()
var/dirtslip = FALSE
var/photosynthesizing = FALSE
var/grows = FALSE
var/shrinks = FALSE
var/rad_levels = list("safe" = 2.5, "danger_1" = 50, "danger_2" = 75, "danger_3" = 150)
var/rad_removal_mod = 1
var/bite_mod = 1
var/grab_resist_divisor_victims = 1
var/grab_resist_divisor_self = 1
var/grab_power_victims = 0
var/grab_power_self = 0
var/waking_speed = 1
var/mudking = FALSE
var/vanity_base_fit //when shapeshifting using vanity_copy_to, this allows you to have add something so they can go back to their original species fit
// Handles non-standard eyes when using a species that utilizes a custom base icon set.
// Eye data is stored in the head organ, and this needs to be handled specially.
/datum/species/proc/handle_base_eyes(var/mob/living/carbon/human/H, var/custom_base)
if(selects_bodytype && custom_base) // only bother if our src species datum allows bases and one is assigned
var/datum/species/S = GLOB.all_species[custom_base]
//extract default eye data from species datum
var/baseHeadPath = S.has_limbs[BP_HEAD]["path"] //has_limbs is a list of lists
if(!baseHeadPath)
return // exit if we couldn't find a head path from the base.
var/obj/item/organ/external/head/baseHead = new baseHeadPath()
if(!baseHead)
return // exit if we didn't create the base properly
var/obj/item/organ/external/head/targetHead = H.get_organ(BP_HEAD)
if(!targetHead)
return // don't bother if target mob has no head for whatever reason
targetHead.eye_icon = baseHead.eye_icon
targetHead.eye_icon_location = baseHead.eye_icon_location
if(!QDELETED(baseHead) && baseHead)
qdel(baseHead)
return
/datum/species/handle_environment_special(var/mob/living/carbon/human/H)
for(var/datum/trait/env_trait in env_traits)
env_trait.handle_environment_special(H)
return
/datum/species/proc/update_vore_belly_def_variant()
// Determine the actual vore_belly_default_variant, if the base species in the VORE tab is set
switch (base_species)
if("Teshari")
vore_belly_default_variant = "T"
if("Unathi")
vore_belly_default_variant = "L"
@@ -1,55 +1,55 @@
//Any species commented out here must be made restricted elsewhere. They are kept here for easy reference of what we disabled.
//Note that at the time of this PR we are simply disabling everything new to discuss keeping versus scrapping later.
/datum/species
var/pain_verb_1p = list("shout", "growl", "grunt", "gasp")
var/pain_verb_3p = list("shouts", "growls", "grunts", "gasps")
///datum/species/zaddat
// spawn_flags = SPECIES_IS_RESTRICTED //Species has been enabled elsewhere.
///datum/species/crew_shadekin
// spawn_flags = SPECIES_IS_RESTRICTED
/datum/species/human/gravworlder
spawn_flags = SPECIES_IS_RESTRICTED
/datum/species/human/spacer
spawn_flags = SPECIES_IS_RESTRICTED
///datum/species/alraune
// spawn_flags = SPECIES_IS_RESTRICTED //Species has been enabled, keeping this here for reference.
///datum/species/werebeast
// spawn_flags = SPECIES_IS_RESTRICTED
/datum/species/shadekin_yw
spawn_flags = SPECIES_IS_RESTRICTED
/datum/species/shadekin
//spawn_flags = SPECIES_IS_RESTRICTED
//datum/species/protean
// spawn_flags = SPECIES_IS_RESTRICTED
//TFF 20/1/20 - More whitelisted species listed here. Unable to force overrides to be enabled here.
/*
/datum/species/xenochimera
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
/datum/species/diona
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
/datum/species/vox
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
*/
//Can use digitigrade flags
/datum/species/shapeshifter/promethean
digi_allowed = TRUE
/datum/species/unathi
vore_belly_default_variant = "L"
/datum/species/protean
digi_allowed = TRUE
//Any species commented out here must be made restricted elsewhere. They are kept here for easy reference of what we disabled.
//Note that at the time of this PR we are simply disabling everything new to discuss keeping versus scrapping later.
/datum/species
var/pain_verb_1p = list("shout", "growl", "grunt", "gasp")
var/pain_verb_3p = list("shouts", "growls", "grunts", "gasps")
///datum/species/zaddat
// spawn_flags = SPECIES_IS_RESTRICTED //Species has been enabled elsewhere.
///datum/species/crew_shadekin
// spawn_flags = SPECIES_IS_RESTRICTED
/datum/species/human/gravworlder
spawn_flags = SPECIES_IS_RESTRICTED
/datum/species/human/spacer
spawn_flags = SPECIES_IS_RESTRICTED
///datum/species/alraune
// spawn_flags = SPECIES_IS_RESTRICTED //Species has been enabled, keeping this here for reference.
///datum/species/werebeast
// spawn_flags = SPECIES_IS_RESTRICTED
/datum/species/shadekin_yw
spawn_flags = SPECIES_IS_RESTRICTED
/datum/species/shadekin
//spawn_flags = SPECIES_IS_RESTRICTED
//datum/species/protean
// spawn_flags = SPECIES_IS_RESTRICTED
//TFF 20/1/20 - More whitelisted species listed here. Unable to force overrides to be enabled here.
/*
/datum/species/xenochimera
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
/datum/species/diona
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
/datum/species/vox
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
*/
//Can use digitigrade flags
/datum/species/shapeshifter/promethean
digi_allowed = TRUE
/datum/species/unathi
vore_belly_default_variant = "L"
/datum/species/protean
digi_allowed = TRUE
@@ -1,297 +1,297 @@
//There is already a station file, but feels wrong to put zaddat balancing changes with the restriction file, and feels wrong to lump them in with a modular station_vr so hello station_ch file
/datum/species/zaddat
toxins_mod = 0.5 //toxins rarely come into play, and zaddat just has negatives. Along with their parasite letting them survive in their polluted planet, this seems reasonable.
//So both of this are based off Fennec foxes I belivive. Those are desert critters, giving them more warm focused levels. And for variety giving them minor brute weakness and minor burn resistant
//I also want to make a dig because fennec foxes actually make burrows and such, but I can't figure out how to do it in a way that is both flavorful but not abuseable
/datum/species/hi_zoxxen //zorrens get wierd chemistry because of their past of expirementing on themselves. Check the cataloguer for deathclaws
chemOD_threshold = 0.75
radiation_mod = 0.5
brute_mod = 1.1
burn_mod = 0.9
cold_level_1 = 270 //Default 260 - Lower is better
cold_level_2 = 210 //Default 200
cold_level_3 = 120 //Default 120
breath_cold_level_1 = 250 //Default 240 - Lower is better
breath_cold_level_2 = 190 //Default 180
breath_cold_level_3 = 100 //Default 100
heat_level_1 = 400 //Default 360 - Higher is better
heat_level_2 = 460 //Default 400
heat_level_3 = 1080 //Default 1000
breath_heat_level_1 = 430 //Default 380 - Higher is better
breath_heat_level_2 = 510 //Default 450
breath_heat_level_3 = 1200 //Default 1250
/datum/species/fl_zorren
item_slowdown_mod = 1.2
slowdown = -0.2
brute_mod = 1.1
burn_mod = 0.9
cold_level_1 = 270 //Default 260 - Lower is better
cold_level_2 = 210 //Default 200
cold_level_3 = 120 //Default 120
breath_cold_level_1 = 250 //Default 240 - Lower is better
breath_cold_level_2 = 190 //Default 180
breath_cold_level_3 = 100 //Default 100
heat_level_1 = 400 //Default 360 - Higher is better
heat_level_2 = 460 //Default 400
heat_level_3 = 1080 //Default 1000
breath_heat_level_1 = 430 //Default 380 - Higher is better
breath_heat_level_2 = 510 //Default 450
breath_heat_level_3 = 1200 //Default 1250
/datum/species/xenomorph_hybrid
name = SPECIES_XENOMORPH_HYBRID
name_plural = "Xenomorph Hybrids"
icobase = 'icons/mob/human_races/r_xenomorph_hybrid.dmi'
deform = 'icons/mob/human_races/r_xenomorph_hybrid.dmi'
tail = "tail"
icobase_tail = 1
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/strong/xeno, /datum/unarmed_attack/bite/strong/xeno) // Innate claws and bite.
darksight = 8 // Same as Tajarans.
ambiguous_genders = TRUE
slowdown = -0.2 // Slightly faster than average.
total_health = 150 // Takes a lot of effort to take a Xenomorph down.
brute_mod = 0.9 // Physical damage doesn't phase them as much.
burn_mod = 1.4 // They do NOT like fire.
toxins_mod = 0.9 // Slightly resistant to toxins.
radiation_mod = 0.9 // Somewhat resistant to radiation exposure.
flash_mod = 1.2 // Flashes are more effective.
metabolic_rate = 1.2 // Very physically active species, thus requiring more nutritional intake.
item_slowdown_mod = 0.9 // They carry heavy things slightly better.
mob_size = MOB_MEDIUM // Technically doesn't even need this but still adding the override just in case.
blood_volume = 640 // More blood to compound their high health.
bloodloss_rate = 1 // Bleed normally.
num_alternate_languages = 3
name_language = LANGUAGE_XENOLINGUA
species_language = LANGUAGE_XENOLINGUA
secondary_langs = list(LANGUAGE_XENOLINGUA, LANGUAGE_HIVEMIND)
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN) // Can use the Hivemind language.
color_mult = 1
health_hud_intensity = 1.5
chem_strength_alcohol = 1.2 // They don't handle their drinks very well.
throwforce_absorb_threshold = 10 // Thrown objects don't do as much.
economic_modifier = 5 // While they aren't true Xenomorphs, they still draw a lot of social stigma, and are generally mistreated and underpaid as a result.
rarity_value = 4 // Very rare to find these guys on human stations.
spawn_flags = SPECIES_CAN_JOIN
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
flesh_color = "##242424"
blood_color = "##00C202"
base_color = "##242424"
blurb = "Xenomorph Hybrids are a strange amalgamation of xenomorph and alternative-species DNA of \
disputed origin. While hybrids share many traits with their species's namesake, the vast majority \
are no less docile or aggressive than the vast majority of spacefaring races. Even still, their unsettling appearance, \
demeanour and innate xenomorph-inherited abilities are enough to draw widespread ire and distrust."
min_age = 18
max_age = 150
move_trail = /obj/effect/decal/cleanable/blood/tracks/claw
digi_allowed = TRUE
icodigi = 'icons/mob/human_races/r_digi_xeno.dmi'
species_sounds = "Xeno"
gender_specific_species_sounds = FALSE
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
// Some Xeno parts included.
has_organ = list(
O_HEART = /obj/item/organ/internal/heart/grey/colormatch,
O_LUNGS = /obj/item/organ/internal/lungs/grey/colormatch,
O_LIVER = /obj/item/organ/internal/liver/grey/colormatch,
O_BRAIN = /obj/item/organ/internal/brain/grey/colormatch,
O_EYES = /obj/item/organ/internal/eyes/grey/colormatch,
O_KIDNEYS = /obj/item/organ/internal/kidneys/grey/colormatch,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/weak, // Less plasma capacity.
O_HIVE = /obj/item/organ/internal/xenos/hivenode, // Lets them speak Hivemind and open resin doors.
O_RESIN = /obj/item/organ/internal/xenos/resinspinner/weak, // Weaker weed nodes with less spread range.
O_EGG = /obj/item/organ/internal/xenos/eggsac // Fluff organ.
)
heat_discomfort_level = 303.15 // 30 Celsius, not so comfortable in high temperatures.
heat_discomfort_strings = list(
"Our carapace bristles in the heat."
)
cold_discomfort_level = 253.15 // -20 Celsius, very comfortable in below freezing temperatures.
cold_discomfort_strings = list(
"The cold bites through our carapace."
)
var/weeds_plasma_rate = 3 // Plasma regen. Much lower than actual xenos. Faster on weeds.
var/weeds_heal_rate = 0.5 // Health regen on weeds. No healing unless resting.
/datum/species/xenomorph_hybrid/handle_environment_special(var/mob/living/carbon/human/H)
var/turf/T = H.loc
if(!T) return
var/datum/gas_mixture/environment = T.return_air()
if(!environment) return
if(environment.gas["phoron"] > 0 || locate(/obj/effect/alien/weeds) in T)
if(!regenerate(H))
var/obj/item/organ/internal/xenos/plasmavessel/P = H.internal_organs_by_name[O_PLASMA]
P.stored_plasma += weeds_plasma_rate
P.stored_plasma = min(max(P.stored_plasma,0),P.max_plasma)
..()
/datum/species/xenomorph_hybrid/proc/regenerate(var/mob/living/carbon/human/H)
var/heal_rate = weeds_heal_rate
var/mend_prob = 5 // Much lower than regular xenos.
if (!H.resting)
heal_rate = 0 // No passive health regen without resting.
mend_prob = 0 // No passive health regen without resting.
// First, heal internal organs.
for(var/obj/item/organ/I in H.internal_organs)
if(I.damage > 0)
I.damage = max(I.damage - heal_rate, 0)
if (prob(5))
to_chat(H, "<span class='alien'>We feel a soothing sensation within our [I.parent_organ]...</span>")
return 1
// Next, heal external damage.
if (H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss())
H.adjustBruteLoss(-heal_rate)
H.adjustFireLoss(-heal_rate)
H.adjustOxyLoss(-heal_rate)
H.adjustToxLoss(-heal_rate)
if (prob(5))
to_chat(H, "<span class='alien'>A soothing sensation falls over us...</span>")
return 1
// Lastly, mend broken bones. May remove this if it's abused.
for(var/obj/item/organ/external/E in H.bad_external_organs)
if (E.status & ORGAN_BROKEN)
if (prob(mend_prob))
if (E.mend_fracture())
to_chat(H, "<span class='alien'>We feel something mend within our [E.name].</span>")
return 1
return 0
/// WEAKER XENOMORPH HYBRID ABILITIES / ORGANS. ///
// ABILITIES //
/mob/living/carbon/human/proc/plant_weak()
set name = "Plant Weeds (150)"
set desc = "Plants some alien weeds."
set category = "Abilities"
if(check_alien_ability(150,1,O_RESIN))
visible_message("<span class='alium'><B>[src] has planted some alien weeds!</B></span>")
new /obj/effect/alien/weeds/node/weak(get_turf(src), null, "#321D37") // Aliens.dm for weed node origin.
playsound(src, 'sound/effects/blobattack.ogg', 40, 1)
return
/mob/living/carbon/human/proc/check_plasma_amount(mob/living/carbon/human/M as mob)
set name = "Check Plasma Reserves"
set category = "Abilities"
var/obj/item/organ/internal/xenos/plasmavessel/I = M.internal_organs_by_name[O_PLASMA]
if(!istype(I))
to_chat(src, "<span class='alium'>Our plasma vessel is missing!</span>")
return
to_chat(src, "Our plasma reserves are at [I.stored_plasma]/[I.max_plasma].")
return 0
/mob/living/carbon/human/proc/resin_weak() // Technically stronger in some aspects.
set name = "Secrete Resin (25)"
set desc = "Secrete tough, malleable resin in front of us."
set category = "Abilities"
var/list/options = list("resin door","resin wall","resin membrane","nest","resin blob")
for(var/option in options)
LAZYSET(options, option, new /image('icons/mob/alien.dmi', option)) // based off 'icons/effects/thinktank_labels.dmi'
var/choice = show_radial_menu(src, src, options, radius = 42, require_near = TRUE)
if(!choice || QDELETED(src) || src.incapacitated())
return FALSE
var/targetLoc = get_step(src, dir)
if(iswall(targetLoc))
targetLoc = get_turf(src)
var/obj/O
switch(choice)
if("resin door")
if(!check_alien_ability(25,1,O_RESIN))
return
else O = new /obj/structure/simple_door/resin(targetLoc)
if("resin wall")
if(!check_alien_ability(25,1,O_RESIN))
return
else O = new /obj/structure/alien/wall(targetLoc)
if("resin membrane")
if(!check_alien_ability(25,1,O_RESIN))
return
else O = new /obj/structure/alien/membrane(targetLoc)
if("nest")
if(!check_alien_ability(25,1,O_RESIN))
return
else O = new /obj/structure/bed/nest(targetLoc)
if("resin blob")
if(!check_alien_ability(25,1,O_RESIN))
return
else O = new /obj/item/stack/material/resin(targetLoc)
if(O)
visible_message("<span class='warning'><B>[src] vomits up a thick purple substance and begins to shape it!</B></span>", "<span class='alium'>You shape a [choice].</span>")
// O.color = "#321D37" // Adding predefined colour icons.
playsound(src, 'sound/effects/blobattack.ogg', 40, 1)
return
// ORGANS //
/obj/item/organ/internal/xenos/resinspinner/weak
name = "hybrid resin spinner"
parent_organ = BP_HEAD
icon_state = "xenode"
organ_tag = O_RESIN
organ_verbs = list(
/mob/living/carbon/human/proc/resin_weak,
/mob/living/carbon/human/proc/plant_weak,
/mob/living/carbon/human/proc/check_plasma_amount
)
/obj/item/organ/internal/xenos/plasmavessel/weak
name = "hybrid plasma vessel"
stored_plasma = 250 // Starts with max plasma.
max_plasma = 250 // Maximum of 250 plasma stored at any one time. Drones normally have 500.
//There is already a station file, but feels wrong to put zaddat balancing changes with the restriction file, and feels wrong to lump them in with a modular station_vr so hello station_ch file
/datum/species/zaddat
toxins_mod = 0.5 //toxins rarely come into play, and zaddat just has negatives. Along with their parasite letting them survive in their polluted planet, this seems reasonable.
//So both of this are based off Fennec foxes I belivive. Those are desert critters, giving them more warm focused levels. And for variety giving them minor brute weakness and minor burn resistant
//I also want to make a dig because fennec foxes actually make burrows and such, but I can't figure out how to do it in a way that is both flavorful but not abuseable
/datum/species/hi_zoxxen //zorrens get wierd chemistry because of their past of expirementing on themselves. Check the cataloguer for deathclaws
chemOD_threshold = 0.75
radiation_mod = 0.5
brute_mod = 1.1
burn_mod = 0.9
cold_level_1 = 270 //Default 260 - Lower is better
cold_level_2 = 210 //Default 200
cold_level_3 = 120 //Default 120
breath_cold_level_1 = 250 //Default 240 - Lower is better
breath_cold_level_2 = 190 //Default 180
breath_cold_level_3 = 100 //Default 100
heat_level_1 = 400 //Default 360 - Higher is better
heat_level_2 = 460 //Default 400
heat_level_3 = 1080 //Default 1000
breath_heat_level_1 = 430 //Default 380 - Higher is better
breath_heat_level_2 = 510 //Default 450
breath_heat_level_3 = 1200 //Default 1250
/datum/species/fl_zorren
item_slowdown_mod = 1.2
slowdown = -0.2
brute_mod = 1.1
burn_mod = 0.9
cold_level_1 = 270 //Default 260 - Lower is better
cold_level_2 = 210 //Default 200
cold_level_3 = 120 //Default 120
breath_cold_level_1 = 250 //Default 240 - Lower is better
breath_cold_level_2 = 190 //Default 180
breath_cold_level_3 = 100 //Default 100
heat_level_1 = 400 //Default 360 - Higher is better
heat_level_2 = 460 //Default 400
heat_level_3 = 1080 //Default 1000
breath_heat_level_1 = 430 //Default 380 - Higher is better
breath_heat_level_2 = 510 //Default 450
breath_heat_level_3 = 1200 //Default 1250
/datum/species/xenomorph_hybrid
name = SPECIES_XENOMORPH_HYBRID
name_plural = "Xenomorph Hybrids"
icobase = 'icons/mob/human_races/r_xenomorph_hybrid.dmi'
deform = 'icons/mob/human_races/r_xenomorph_hybrid.dmi'
tail = "tail"
icobase_tail = 1
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/strong/xeno, /datum/unarmed_attack/bite/strong/xeno) // Innate claws and bite.
darksight = 8 // Same as Tajarans.
ambiguous_genders = TRUE
slowdown = -0.2 // Slightly faster than average.
total_health = 150 // Takes a lot of effort to take a Xenomorph down.
brute_mod = 0.9 // Physical damage doesn't phase them as much.
burn_mod = 1.4 // They do NOT like fire.
toxins_mod = 0.9 // Slightly resistant to toxins.
radiation_mod = 0.9 // Somewhat resistant to radiation exposure.
flash_mod = 1.2 // Flashes are more effective.
metabolic_rate = 1.2 // Very physically active species, thus requiring more nutritional intake.
item_slowdown_mod = 0.9 // They carry heavy things slightly better.
mob_size = MOB_MEDIUM // Technically doesn't even need this but still adding the override just in case.
blood_volume = 640 // More blood to compound their high health.
bloodloss_rate = 1 // Bleed normally.
num_alternate_languages = 3
name_language = LANGUAGE_XENOLINGUA
species_language = LANGUAGE_XENOLINGUA
secondary_langs = list(LANGUAGE_XENOLINGUA, LANGUAGE_HIVEMIND)
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN) // Can use the Hivemind language.
color_mult = 1
health_hud_intensity = 1.5
chem_strength_alcohol = 1.2 // They don't handle their drinks very well.
throwforce_absorb_threshold = 10 // Thrown objects don't do as much.
economic_modifier = 5 // While they aren't true Xenomorphs, they still draw a lot of social stigma, and are generally mistreated and underpaid as a result.
rarity_value = 4 // Very rare to find these guys on human stations.
spawn_flags = SPECIES_CAN_JOIN
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
flesh_color = "##242424"
blood_color = "##00C202"
base_color = "##242424"
blurb = "Xenomorph Hybrids are a strange amalgamation of xenomorph and alternative-species DNA of \
disputed origin. While hybrids share many traits with their species's namesake, the vast majority \
are no less docile or aggressive than the vast majority of spacefaring races. Even still, their unsettling appearance, \
demeanour and innate xenomorph-inherited abilities are enough to draw widespread ire and distrust."
min_age = 18
max_age = 150
move_trail = /obj/effect/decal/cleanable/blood/tracks/claw
digi_allowed = TRUE
icodigi = 'icons/mob/human_races/r_digi_xeno.dmi'
species_sounds = "Xeno"
gender_specific_species_sounds = FALSE
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
// Some Xeno parts included.
has_organ = list(
O_HEART = /obj/item/organ/internal/heart/grey/colormatch,
O_LUNGS = /obj/item/organ/internal/lungs/grey/colormatch,
O_LIVER = /obj/item/organ/internal/liver/grey/colormatch,
O_BRAIN = /obj/item/organ/internal/brain/grey/colormatch,
O_EYES = /obj/item/organ/internal/eyes/grey/colormatch,
O_KIDNEYS = /obj/item/organ/internal/kidneys/grey/colormatch,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/weak, // Less plasma capacity.
O_HIVE = /obj/item/organ/internal/xenos/hivenode, // Lets them speak Hivemind and open resin doors.
O_RESIN = /obj/item/organ/internal/xenos/resinspinner/weak, // Weaker weed nodes with less spread range.
O_EGG = /obj/item/organ/internal/xenos/eggsac // Fluff organ.
)
heat_discomfort_level = 303.15 // 30 Celsius, not so comfortable in high temperatures.
heat_discomfort_strings = list(
"Our carapace bristles in the heat."
)
cold_discomfort_level = 253.15 // -20 Celsius, very comfortable in below freezing temperatures.
cold_discomfort_strings = list(
"The cold bites through our carapace."
)
var/weeds_plasma_rate = 3 // Plasma regen. Much lower than actual xenos. Faster on weeds.
var/weeds_heal_rate = 0.5 // Health regen on weeds. No healing unless resting.
/datum/species/xenomorph_hybrid/handle_environment_special(var/mob/living/carbon/human/H)
var/turf/T = H.loc
if(!T) return
var/datum/gas_mixture/environment = T.return_air()
if(!environment) return
if(environment.gas["phoron"] > 0 || locate(/obj/effect/alien/weeds) in T)
if(!regenerate(H))
var/obj/item/organ/internal/xenos/plasmavessel/P = H.internal_organs_by_name[O_PLASMA]
P.stored_plasma += weeds_plasma_rate
P.stored_plasma = min(max(P.stored_plasma,0),P.max_plasma)
..()
/datum/species/xenomorph_hybrid/proc/regenerate(var/mob/living/carbon/human/H)
var/heal_rate = weeds_heal_rate
var/mend_prob = 5 // Much lower than regular xenos.
if (!H.resting)
heal_rate = 0 // No passive health regen without resting.
mend_prob = 0 // No passive health regen without resting.
// First, heal internal organs.
for(var/obj/item/organ/I in H.internal_organs)
if(I.damage > 0)
I.damage = max(I.damage - heal_rate, 0)
if (prob(5))
to_chat(H, "<span class='alien'>We feel a soothing sensation within our [I.parent_organ]...</span>")
return 1
// Next, heal external damage.
if (H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss())
H.adjustBruteLoss(-heal_rate)
H.adjustFireLoss(-heal_rate)
H.adjustOxyLoss(-heal_rate)
H.adjustToxLoss(-heal_rate)
if (prob(5))
to_chat(H, "<span class='alien'>A soothing sensation falls over us...</span>")
return 1
// Lastly, mend broken bones. May remove this if it's abused.
for(var/obj/item/organ/external/E in H.bad_external_organs)
if (E.status & ORGAN_BROKEN)
if (prob(mend_prob))
if (E.mend_fracture())
to_chat(H, "<span class='alien'>We feel something mend within our [E.name].</span>")
return 1
return 0
/// WEAKER XENOMORPH HYBRID ABILITIES / ORGANS. ///
// ABILITIES //
/mob/living/carbon/human/proc/plant_weak()
set name = "Plant Weeds (150)"
set desc = "Plants some alien weeds."
set category = "Abilities"
if(check_alien_ability(150,1,O_RESIN))
visible_message("<span class='alium'><B>[src] has planted some alien weeds!</B></span>")
new /obj/effect/alien/weeds/node/weak(get_turf(src), null, "#321D37") // Aliens.dm for weed node origin.
playsound(src, 'sound/effects/blobattack.ogg', 40, 1)
return
/mob/living/carbon/human/proc/check_plasma_amount(mob/living/carbon/human/M as mob)
set name = "Check Plasma Reserves"
set category = "Abilities"
var/obj/item/organ/internal/xenos/plasmavessel/I = M.internal_organs_by_name[O_PLASMA]
if(!istype(I))
to_chat(src, "<span class='alium'>Our plasma vessel is missing!</span>")
return
to_chat(src, "Our plasma reserves are at [I.stored_plasma]/[I.max_plasma].")
return 0
/mob/living/carbon/human/proc/resin_weak() // Technically stronger in some aspects.
set name = "Secrete Resin (25)"
set desc = "Secrete tough, malleable resin in front of us."
set category = "Abilities"
var/list/options = list("resin door","resin wall","resin membrane","nest","resin blob")
for(var/option in options)
LAZYSET(options, option, new /image('icons/mob/alien.dmi', option)) // based off 'icons/effects/thinktank_labels.dmi'
var/choice = show_radial_menu(src, src, options, radius = 42, require_near = TRUE)
if(!choice || QDELETED(src) || src.incapacitated())
return FALSE
var/targetLoc = get_step(src, dir)
if(iswall(targetLoc))
targetLoc = get_turf(src)
var/obj/O
switch(choice)
if("resin door")
if(!check_alien_ability(25,1,O_RESIN))
return
else O = new /obj/structure/simple_door/resin(targetLoc)
if("resin wall")
if(!check_alien_ability(25,1,O_RESIN))
return
else O = new /obj/structure/alien/wall(targetLoc)
if("resin membrane")
if(!check_alien_ability(25,1,O_RESIN))
return
else O = new /obj/structure/alien/membrane(targetLoc)
if("nest")
if(!check_alien_ability(25,1,O_RESIN))
return
else O = new /obj/structure/bed/nest(targetLoc)
if("resin blob")
if(!check_alien_ability(25,1,O_RESIN))
return
else O = new /obj/item/stack/material/resin(targetLoc)
if(O)
visible_message("<span class='warning'><B>[src] vomits up a thick purple substance and begins to shape it!</B></span>", "<span class='alium'>You shape a [choice].</span>")
// O.color = "#321D37" // Adding predefined colour icons.
playsound(src, 'sound/effects/blobattack.ogg', 40, 1)
return
// ORGANS //
/obj/item/organ/internal/xenos/resinspinner/weak
name = "hybrid resin spinner"
parent_organ = BP_HEAD
icon_state = "xenode"
organ_tag = O_RESIN
organ_verbs = list(
/mob/living/carbon/human/proc/resin_weak,
/mob/living/carbon/human/proc/plant_weak,
/mob/living/carbon/human/proc/check_plasma_amount
)
/obj/item/organ/internal/xenos/plasmavessel/weak
name = "hybrid plasma vessel"
stored_plasma = 250 // Starts with max plasma.
max_plasma = 250 // Maximum of 250 plasma stored at any one time. Drones normally have 500.
@@ -1,13 +1,13 @@
/datum/trait/negative/deep_sleeper
custom_only = FALSE
/datum/trait/negative/deep_breather
name ="Deep Breather"
desc = "You need more air for your lungs to properly work.."
cost = -1
custom_only = FALSE
can_take = ORGANICS
var_changes = list("minimum_breath_pressure" = 18)
/datum/trait/negative/deep_sleeper
custom_only = FALSE
/datum/trait/negative/deep_breather
name ="Deep Breather"
desc = "You need more air for your lungs to properly work.."
cost = -1
custom_only = FALSE
can_take = ORGANICS
var_changes = list("minimum_breath_pressure" = 18)
excludes = list(/datum/trait/positive/light_breather)
@@ -1,18 +1,18 @@
/datum/trait/neutral/hardfeet
custom_only = FALSE
/datum/trait/positive/linguist
custom_only = FALSE
/datum/trait/positive/toxin_gut
custom_only = FALSE
/datum/trait/positive/light_breather
name ="Light Breather"
desc = "You need less air for your lungs to properly work.."
cost = 1
custom_only = FALSE
can_take = ORGANICS
var_changes = list("minimum_breath_pressure" = 12)
/datum/trait/neutral/hardfeet
custom_only = FALSE
/datum/trait/positive/linguist
custom_only = FALSE
/datum/trait/positive/toxin_gut
custom_only = FALSE
/datum/trait/positive/light_breather
name ="Light Breather"
desc = "You need less air for your lungs to properly work.."
cost = 1
custom_only = FALSE
can_take = ORGANICS
var_changes = list("minimum_breath_pressure" = 12)
excludes = list(/datum/trait/negative/deep_breather)
@@ -1,42 +1,42 @@
/hook/startup/proc/Modular_Borg_init_Exploration()
robot_modules["Exploration"] = /obj/item/weapon/robot_module/robot/exploration //add to array
robot_module_types += "Exploration" //Add to global list
return 1
//Explo doggos
/obj/item/weapon/robot_module/robot/exploration
name = "exploration robot module"
channels = list("Explorer" = 1)
languages = list(
LANGUAGE_SOL_COMMON = 1,
LANGUAGE_UNATHI = 1,
LANGUAGE_SIIK = 1,
LANGUAGE_AKHANI = 1,
LANGUAGE_SKRELLIAN = 1,
LANGUAGE_SKRELLIANFAR = 0,
LANGUAGE_ROOTLOCAL = 0,
LANGUAGE_TRADEBAND = 1,
LANGUAGE_GUTTER = 0,
LANGUAGE_SCHECHI = 1,
LANGUAGE_EAL = 1,
LANGUAGE_TERMINUS = 1,
LANGUAGE_SIGN = 0
)
/obj/item/weapon/robot_module/robot/exploration
can_be_pushed = 0
/obj/item/weapon/robot_module/robot/exploration/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/device/dogborg/sleeper/exploration(src)
src.modules += new /obj/item/device/cataloguer(src)
src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg/flare(src)
src.modules += new /obj/item/weapon/dogborg/pounce(src)
src.modules += new /obj/item/weapon/melee/combat_borgblade/explotailspear(src)
src.modules += new /obj/item/weapon/gun/energy/medigun/mounted/smallmedigun(src)
src.modules += new /obj/item/shield_projector/line/exploborg(src)
src.modules += new /obj/item/roller_holder(src)
src.modules += new /obj/item/device/self_repair_system(src)
src.emag += new /obj/item/weapon/melee/dogborg/jaws/big/explojaws(src)
..()
/hook/startup/proc/Modular_Borg_init_Exploration()
robot_modules["Exploration"] = /obj/item/weapon/robot_module/robot/exploration //add to array
robot_module_types += "Exploration" //Add to global list
return 1
//Explo doggos
/obj/item/weapon/robot_module/robot/exploration
name = "exploration robot module"
channels = list("Explorer" = 1)
languages = list(
LANGUAGE_SOL_COMMON = 1,
LANGUAGE_UNATHI = 1,
LANGUAGE_SIIK = 1,
LANGUAGE_AKHANI = 1,
LANGUAGE_SKRELLIAN = 1,
LANGUAGE_SKRELLIANFAR = 0,
LANGUAGE_ROOTLOCAL = 0,
LANGUAGE_TRADEBAND = 1,
LANGUAGE_GUTTER = 0,
LANGUAGE_SCHECHI = 1,
LANGUAGE_EAL = 1,
LANGUAGE_TERMINUS = 1,
LANGUAGE_SIGN = 0
)
/obj/item/weapon/robot_module/robot/exploration
can_be_pushed = 0
/obj/item/weapon/robot_module/robot/exploration/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/device/dogborg/sleeper/exploration(src)
src.modules += new /obj/item/device/cataloguer(src)
src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg/flare(src)
src.modules += new /obj/item/weapon/dogborg/pounce(src)
src.modules += new /obj/item/weapon/melee/combat_borgblade/explotailspear(src)
src.modules += new /obj/item/weapon/gun/energy/medigun/mounted/smallmedigun(src)
src.modules += new /obj/item/shield_projector/line/exploborg(src)
src.modules += new /obj/item/roller_holder(src)
src.modules += new /obj/item/device/self_repair_system(src)
src.emag += new /obj/item/weapon/melee/dogborg/jaws/big/explojaws(src)
..()
@@ -1,3 +1,3 @@
/datum/robot_sprite
var/list/belly_light_list = list() // Support multiple sleepers with r/g light "sleeper"
var/list/belly_capacity_list = list() //Support multiple bellies with multiple sizes, default: "sleeper" = 1
/datum/robot_sprite
var/list/belly_light_list = list() // Support multiple sleepers with r/g light "sleeper"
var/list/belly_capacity_list = list() //Support multiple bellies with multiple sizes, default: "sleeper" = 1
@@ -1,18 +1,18 @@
//I don't know how to add more material currently so uhhh, that will be for late, did have some halffinished un commented code but that seemed to be causing issues?
/mob/living/simple_mob/vore/bigdragon
meat_type = /obj/item/weapon/reagent_containers/food/snacks/dragonmeat
/mob/living/simple_mob/vore/aggressive/dragon/virgo3b //phoron dragon
meat_type = /obj/item/weapon/reagent_containers/food/snacks/phorondragonmeat
/mob/living/simple_mob/vore/aggressive/deathclaw
meat_type = /obj/item/weapon/reagent_containers/food/snacks/deathclawmeat
/mob/living/simple_mob/metroid
meat_type = /obj/item/weapon/reagent_containers/food/snacks/metroidmeat
/mob/living/simple_mob/metroid/can_butcher(var/mob/user, var/obj/item/I) // Override for special butchering checks.
. = ..()
if(. && (!is_sharp(I) || !has_edge(I)))
return FALSE
//I don't know how to add more material currently so uhhh, that will be for late, did have some halffinished un commented code but that seemed to be causing issues?
/mob/living/simple_mob/vore/bigdragon
meat_type = /obj/item/weapon/reagent_containers/food/snacks/dragonmeat
/mob/living/simple_mob/vore/aggressive/dragon/virgo3b //phoron dragon
meat_type = /obj/item/weapon/reagent_containers/food/snacks/phorondragonmeat
/mob/living/simple_mob/vore/aggressive/deathclaw
meat_type = /obj/item/weapon/reagent_containers/food/snacks/deathclawmeat
/mob/living/simple_mob/metroid
meat_type = /obj/item/weapon/reagent_containers/food/snacks/metroidmeat
/mob/living/simple_mob/metroid/can_butcher(var/mob/user, var/obj/item/I) // Override for special butchering checks.
. = ..()
if(. && (!is_sharp(I) || !has_edge(I)))
return FALSE
@@ -1,210 +1,210 @@
/mob/living/simple_mob/animal/space/alien
maxHealth = 100
health = 100
harm_intent_damage = 5
melee_damage_lower = 25
melee_damage_upper = 25
attack_armor_pen = 15
/mob/living/simple_mob/animal/space/alien/drone
health = 60
melee_damage_lower = 15
melee_damage_upper = 15
/mob/living/simple_mob/animal/space/alien/sentinel
health = 120
melee_damage_lower = 15
melee_damage_upper = 15
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian
maxHealth = 200
health = 200
/mob/living/simple_mob/animal/space/alien/queen
health = 125
maxHealth = 125
melee_damage_lower = 7
melee_damage_upper = 7
/mob/living/simple_mob/animal/space/alien/queen/empress
maxHealth = 200
health = 200
/mob/living/simple_mob/animal/space/alien/queen/empress/mother
maxHealth = 300
health = 300
melee_damage_lower = 7
melee_damage_upper = 12
//what are this things?
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian/echo
name = "alien Echopraetorian"
color = "#424242"
health = 150
maxHealth = 150
needs_reload = 1
projectiletype = /obj/item/projectile/sonic/strong
reload_time = 150 SECONDS
ai_holder_type = /datum/ai_holder/simple_mob/ranged/careful
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian/ion
name = "alien Ionic praetorian"
color = "#004cff"
armor = list(melee = 0,bullet = 25,laser = 0,energy = 0,bomb = 0,bio = 100,rad = 100)
health = 175
maxHealth = 175
needs_reload = 1
projectiletype = /obj/item/projectile/arc/emp_blast
reload_time = 150 SECONDS
reload_max = 3
ai_holder_type = /datum/ai_holder/simple_mob/ranged/careful
size_multiplier = 1.5
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian/blaze
name = "alien blazing praetorian"
color = "Red"
armor = list(melee = 0, bullet = 0, laser = 25, energy = 0, bomb = 0, bio = 100, rad = 100)
health = 225
maxHealth = 225
needs_reload = 1
projectiletype = /obj/item/projectile/energy/fireball
reload_max = 3
reload_time = 200
ai_holder_type = /datum/ai_holder/simple_mob/ranged/careful
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian/splat
name = "alien splattetorian"
color = "#a604b8"
needs_reload = 1
projectiletype = /obj/item/projectile/energy/blob/acid/splattering
reload_max = 5
reload_time = 150
size_multiplier = 0.75
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian/tank
name = "alien Tankerling"
armor_soak = list(melee = -15, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0)
base_attack_cooldown = 25
color = "#ff8214"
health = 350
maxHealth = 350
melee_damage_lower = 12
melee_damage_upper = 17
movement_cooldown = 10
movement_shake_radius = 7
movement_sound = 'sound/weapons/heavysmash.ogg'
projectiletype = null
size_multiplier = 2
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian/acid
projectiletype = /obj/item/projectile/energy/acid
/mob/living/simple_mob/animal/space/alien/queen/empress/star
name = "alien Staticlisk"
ai_holder_type = /datum/ai_holder/simple_mob/ranged/careful
armor_soak = list(melee = -10, bullet = 10, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0)
base_attack_cooldown = 15
color = "#38b9ff"
health = 250
maxHealth = 250
melee_damage_lower = 12
melee_damage_upper = 25
movement_cooldown = 12
movement_shake_radius = 7
needs_reload = 1
projectilesound = null
projectiletype = /obj/item/projectile/beam/chain_lightning/lesser
reload_max = 3
reload_time = 200
size_multiplier = 1.5
/mob/living/simple_mob/animal/space/alien/queen/empress/tank
name = "alien tankerlisk"
armor_soak = list(melee = -10, bullet = 10, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0)
base_attack_cooldown = 25
color = "#4a4a4a"
health = 625
maxHealth = 625
melee_damage_lower = 12
melee_damage_upper = 25
movement_cooldown = 12
movement_shake_radius = 7
needs_reload = 1
projectilesound = null
projectiletype = null
size_multiplier = 3
/mob/living/simple_mob/animal/space/alien/sentinel/electro
name = "alien Electrosentinel"
ai_holder_type = /datum/ai_holder/simple_mob/ranged/careful
armor_soak = list(melee = 0, bullet = 5, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0)
color = "#ccff4a"
health = 100
maxHealth = 100
needs_reload = 1
projectiletype = /obj/item/projectile/beam/stun/electric_spider
reload_max = 5
reload_time = 150
size_multiplier = 1.5
/mob/living/simple_mob/animal/space/alien/sentinel/pyro
name = "alien Pyrosentinel"
armor = list (melee = 0, bullet = 0, laser = 15, energy = 0, bomb = 0, bio = 100, rad = 100)
base_attack_cooldown = 15
color = "#ff7373"
health = 125
maxHealth = 125
needs_reload = 1
projectiletype = /obj/item/projectile/bullet/incendiary/dragonflame
reload_max = 2
reload_time = 150
/mob/living/simple_mob/animal/space/alien/sentinel/cyro
name = "alien cryosentinel"
ai_holder_type = /datum/ai_holder/simple_mob/ranged/careful
armor = list(melee = 0, bullet = 15, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
color = "#4f83ff"
health = 100
maxHealth = 100
needs_reload = 1
projectiletype = /obj/item/projectile/energy/blob/freezing/splattering
reload_max = 3
reload_time = 100
size_multiplier = 1.5
/mob/living/simple_mob/animal/space/alien/sentinel/acid
projectiletype = /obj/item/projectile/energy/acid
/mob/living/simple_mob/animal/space/alien/tanky
health = 100
maxHealth = 100
/mob/living/simple_mob/animal/space/alien/hunterling
name = "alien hunterling"
attack_armor_pen = 1
base_attack_cooldown = 2
color = "#1cbdff"
force_max_speed = 1
health = 15
maxHealth = 15
melee_damage_lower = 1
melee_damage_upper = 3
size_multiplier = 0.5
/mob/living/simple_mob/animal/space/alien/hunterlisk
name = "alien hunterlisk"
base_attack_cooldown = 15
color = "#575757"
health = 75
maxHealth = 75
melee_damage_upper = 17
movement_cooldown = 3
size_multiplier = 1.25
/mob/living/simple_mob/animal/space/alien/queen/empress/mother/big
ai_holder_type = /datum/ai_holder/simple_mob/ranged/careful
needs_reload = 1
projectiletype = /obj/item/projectile/energy/blob/toxic/splattering
reload_max = 5
reload_time = 150
/mob/living/simple_mob/animal/space/alien
maxHealth = 100
health = 100
harm_intent_damage = 5
melee_damage_lower = 25
melee_damage_upper = 25
attack_armor_pen = 15
/mob/living/simple_mob/animal/space/alien/drone
health = 60
melee_damage_lower = 15
melee_damage_upper = 15
/mob/living/simple_mob/animal/space/alien/sentinel
health = 120
melee_damage_lower = 15
melee_damage_upper = 15
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian
maxHealth = 200
health = 200
/mob/living/simple_mob/animal/space/alien/queen
health = 125
maxHealth = 125
melee_damage_lower = 7
melee_damage_upper = 7
/mob/living/simple_mob/animal/space/alien/queen/empress
maxHealth = 200
health = 200
/mob/living/simple_mob/animal/space/alien/queen/empress/mother
maxHealth = 300
health = 300
melee_damage_lower = 7
melee_damage_upper = 12
//what are this things?
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian/echo
name = "alien Echopraetorian"
color = "#424242"
health = 150
maxHealth = 150
needs_reload = 1
projectiletype = /obj/item/projectile/sonic/strong
reload_time = 150 SECONDS
ai_holder_type = /datum/ai_holder/simple_mob/ranged/careful
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian/ion
name = "alien Ionic praetorian"
color = "#004cff"
armor = list(melee = 0,bullet = 25,laser = 0,energy = 0,bomb = 0,bio = 100,rad = 100)
health = 175
maxHealth = 175
needs_reload = 1
projectiletype = /obj/item/projectile/arc/emp_blast
reload_time = 150 SECONDS
reload_max = 3
ai_holder_type = /datum/ai_holder/simple_mob/ranged/careful
size_multiplier = 1.5
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian/blaze
name = "alien blazing praetorian"
color = "Red"
armor = list(melee = 0, bullet = 0, laser = 25, energy = 0, bomb = 0, bio = 100, rad = 100)
health = 225
maxHealth = 225
needs_reload = 1
projectiletype = /obj/item/projectile/energy/fireball
reload_max = 3
reload_time = 200
ai_holder_type = /datum/ai_holder/simple_mob/ranged/careful
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian/splat
name = "alien splattetorian"
color = "#a604b8"
needs_reload = 1
projectiletype = /obj/item/projectile/energy/blob/acid/splattering
reload_max = 5
reload_time = 150
size_multiplier = 0.75
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian/tank
name = "alien Tankerling"
armor_soak = list(melee = -15, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0)
base_attack_cooldown = 25
color = "#ff8214"
health = 350
maxHealth = 350
melee_damage_lower = 12
melee_damage_upper = 17
movement_cooldown = 10
movement_shake_radius = 7
movement_sound = 'sound/weapons/heavysmash.ogg'
projectiletype = null
size_multiplier = 2
/mob/living/simple_mob/animal/space/alien/sentinel/praetorian/acid
projectiletype = /obj/item/projectile/energy/acid
/mob/living/simple_mob/animal/space/alien/queen/empress/star
name = "alien Staticlisk"
ai_holder_type = /datum/ai_holder/simple_mob/ranged/careful
armor_soak = list(melee = -10, bullet = 10, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0)
base_attack_cooldown = 15
color = "#38b9ff"
health = 250
maxHealth = 250
melee_damage_lower = 12
melee_damage_upper = 25
movement_cooldown = 12
movement_shake_radius = 7
needs_reload = 1
projectilesound = null
projectiletype = /obj/item/projectile/beam/chain_lightning/lesser
reload_max = 3
reload_time = 200
size_multiplier = 1.5
/mob/living/simple_mob/animal/space/alien/queen/empress/tank
name = "alien tankerlisk"
armor_soak = list(melee = -10, bullet = 10, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0)
base_attack_cooldown = 25
color = "#4a4a4a"
health = 625
maxHealth = 625
melee_damage_lower = 12
melee_damage_upper = 25
movement_cooldown = 12
movement_shake_radius = 7
needs_reload = 1
projectilesound = null
projectiletype = null
size_multiplier = 3
/mob/living/simple_mob/animal/space/alien/sentinel/electro
name = "alien Electrosentinel"
ai_holder_type = /datum/ai_holder/simple_mob/ranged/careful
armor_soak = list(melee = 0, bullet = 5, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0)
color = "#ccff4a"
health = 100
maxHealth = 100
needs_reload = 1
projectiletype = /obj/item/projectile/beam/stun/electric_spider
reload_max = 5
reload_time = 150
size_multiplier = 1.5
/mob/living/simple_mob/animal/space/alien/sentinel/pyro
name = "alien Pyrosentinel"
armor = list (melee = 0, bullet = 0, laser = 15, energy = 0, bomb = 0, bio = 100, rad = 100)
base_attack_cooldown = 15
color = "#ff7373"
health = 125
maxHealth = 125
needs_reload = 1
projectiletype = /obj/item/projectile/bullet/incendiary/dragonflame
reload_max = 2
reload_time = 150
/mob/living/simple_mob/animal/space/alien/sentinel/cyro
name = "alien cryosentinel"
ai_holder_type = /datum/ai_holder/simple_mob/ranged/careful
armor = list(melee = 0, bullet = 15, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
color = "#4f83ff"
health = 100
maxHealth = 100
needs_reload = 1
projectiletype = /obj/item/projectile/energy/blob/freezing/splattering
reload_max = 3
reload_time = 100
size_multiplier = 1.5
/mob/living/simple_mob/animal/space/alien/sentinel/acid
projectiletype = /obj/item/projectile/energy/acid
/mob/living/simple_mob/animal/space/alien/tanky
health = 100
maxHealth = 100
/mob/living/simple_mob/animal/space/alien/hunterling
name = "alien hunterling"
attack_armor_pen = 1
base_attack_cooldown = 2
color = "#1cbdff"
force_max_speed = 1
health = 15
maxHealth = 15
melee_damage_lower = 1
melee_damage_upper = 3
size_multiplier = 0.5
/mob/living/simple_mob/animal/space/alien/hunterlisk
name = "alien hunterlisk"
base_attack_cooldown = 15
color = "#575757"
health = 75
maxHealth = 75
melee_damage_upper = 17
movement_cooldown = 3
size_multiplier = 1.25
/mob/living/simple_mob/animal/space/alien/queen/empress/mother/big
ai_holder_type = /datum/ai_holder/simple_mob/ranged/careful
needs_reload = 1
projectiletype = /obj/item/projectile/energy/blob/toxic/splattering
reload_max = 5
reload_time = 150
size_multiplier = 2
@@ -1,45 +1,45 @@
/mob/living/simple_mob/animal/space/mouse_army
maxHealth = 25
health = 25
//Honestly with pretty low damage I am not touching it.
/mob/living/simple_mob/animal/space/mouse_army/operative
icon_state = "mouse_operative"
item_state = "mouse_operative"
icon_living = "mouse_operative"
icon_dead = "mouse_operative_dead"
icon_rest = "mouse_operative_sleep"
/mob/living/simple_mob/animal/space/mouse_army/pyro
icon_state = "mouse_pyro"
item_state = "mouse_pyro"
icon_living = "mouse_pyro"
icon_dead = "mouse_pyro_dead"
icon_rest = "mouse_pyro_sleep"
/mob/living/simple_mob/animal/space/mouse_army/ammo
icon_state = "mouse_ammo"
item_state = "mouse_ammo"
icon_living = "mouse_ammo"
icon_dead = "mouse_ammo_dead"
icon_rest = "mouse_ammo_sleep"
maxHealth = 15
health = 15
/mob/living/simple_mob/animal/space/mouse_army/stealth
icon_state = "mouse_stealth"
item_state = "mouse_stealth"
icon_living = "mouse_stealth"
icon_dead = "mouse_stealth_dead"
icon_rest = "mouse_stealth_sleep"
/mob/living/simple_mob/mechanical/mecha/mouse_tank
maxHealth = 75
/mob/living/simple_mob/mechanical/mecha/mouse_tank/livewire
maxHealth = 100
/mob/living/simple_mob/mechanical/mecha/mouse_tank/eraticator
/mob/living/simple_mob/animal/space/mouse_army
maxHealth = 25
health = 25
//Honestly with pretty low damage I am not touching it.
/mob/living/simple_mob/animal/space/mouse_army/operative
icon_state = "mouse_operative"
item_state = "mouse_operative"
icon_living = "mouse_operative"
icon_dead = "mouse_operative_dead"
icon_rest = "mouse_operative_sleep"
/mob/living/simple_mob/animal/space/mouse_army/pyro
icon_state = "mouse_pyro"
item_state = "mouse_pyro"
icon_living = "mouse_pyro"
icon_dead = "mouse_pyro_dead"
icon_rest = "mouse_pyro_sleep"
/mob/living/simple_mob/animal/space/mouse_army/ammo
icon_state = "mouse_ammo"
item_state = "mouse_ammo"
icon_living = "mouse_ammo"
icon_dead = "mouse_ammo_dead"
icon_rest = "mouse_ammo_sleep"
maxHealth = 15
health = 15
/mob/living/simple_mob/animal/space/mouse_army/stealth
icon_state = "mouse_stealth"
item_state = "mouse_stealth"
icon_living = "mouse_stealth"
icon_dead = "mouse_stealth_dead"
icon_rest = "mouse_stealth_sleep"
/mob/living/simple_mob/mechanical/mecha/mouse_tank
maxHealth = 75
/mob/living/simple_mob/mechanical/mecha/mouse_tank/livewire
maxHealth = 100
/mob/living/simple_mob/mechanical/mecha/mouse_tank/eraticator
maxHealth = 150
@@ -1,211 +1,211 @@
//Unfiying spider health, into two catagories. Disrupters and tanks.
/mob/living/simple_mob/animal/giant_spider/carrier //Disrupter, old 100
maxHealth = 30
health = 30
melee_damage_lower = 4
melee_damage_upper = 12
/mob/living/simple_mob/animal/giant_spider/electric //disrupter, old 210
maxHealth = 30
health = 30
projectiletype = /obj/item/projectile/energy/mob/electric_spider
melee_damage_lower = 5
melee_damage_upper = 12
/mob/living/simple_mob/animal/giant_spider/frost //tank, old 175
maxHealth = 60
health = 60
/mob/living/simple_mob/animal/giant_spider //tank, old 200
maxHealth = 60
health = 60
melee_damage_lower = 9
melee_damage_upper = 15
/mob/living/simple_mob/animal/giant_spider/ion //disrupter, old 90
maxHealth = 30
health = 30
/mob/living/simple_mob/animal/giant_spider/hunter //disrupter, old 120
maxHealth = 30
health = 30
/mob/living/simple_mob/animal/giant_spider/lurker //disrupter, old 100
maxHealth = 30
health = 30
/mob/living/simple_mob/animal/giant_spider/pepper //tank, old 210
maxHealth = 60
health = 60
/mob/living/simple_mob/animal/giant_spider/phorogenic //tank, old 225
maxHealth = 60
health = 60
melee_damage_lower = 12
melee_damage_upper = 20
/mob/living/simple_mob/animal/giant_spider/thermic //tank, old 175
maxHealth = 60
health = 60
melee_damage_lower = 5
melee_damage_upper = 12
/mob/living/simple_mob/animal/giant_spider/tunneler //disrupter, old 120
maxHealth = 30
health = 30
/mob/living/simple_mob/animal/giant_spider/webslinger //disrupter, old 90
maxHealth = 30
health = 30
/obj/effect/spider/eggcluster
spider_type = /obj/effect/spider/spiderling/varied
/mob/living/simple_mob/animal/giant_spider/broodmother
maxHealth = 400
health = 400
melee_damage_lower = 12
melee_damage_upper = 20
/mob/living/simple_mob/animal/giant_spider/frost/broodling
maxHealth = 20
health = 20
melee_damage_lower = 5
melee_damage_upper = 7
/mob/living/simple_mob/animal/giant_spider/electric/broodling
maxHealth = 15
health = 15
/mob/living/simple_mob/animal/giant_spider/hunter/broodling
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/lurker/broodling
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/nurse/broodling
maxHealth = 30
health = 30
/mob/living/simple_mob/animal/giant_spider/pepper/broodling
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/thermic/broodling
maxHealth = 20
health = 20
melee_damage_lower = 5
melee_damage_upper = 7
/mob/living/simple_mob/animal/giant_spider/tunneler/broodling
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/webslinger/broodling
maxHealth = 15
health = 15
/mob/living/simple_mob/animal/giant_spider/broodling
maxHealth = 30
health = 30
melee_damage_lower = 5
melee_damage_upper = 10
//Hijacking this file to make new event spiders
/mob/living/simple_mob/animal/giant_spider/frost/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 20
health = 20
melee_damage_lower = 5
melee_damage_upper = 7
/mob/living/simple_mob/animal/giant_spider/electric/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 15
health = 15
/mob/living/simple_mob/animal/giant_spider/hunter/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/lurker/space
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/nurse/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
egg_type = /obj/effect/spider/eggcluster/royal/space
maxHealth = 30
health = 30
/mob/living/simple_mob/animal/giant_spider/pepper/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/thermic/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 20
health = 20
melee_damage_lower = 5
melee_damage_upper = 7
/mob/living/simple_mob/animal/giant_spider/tunneler/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/webslinger/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 15
health = 15
/mob/living/simple_mob/animal/giant_spider/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 30
health = 30
melee_damage_lower = 5
//Unfiying spider health, into two catagories. Disrupters and tanks.
/mob/living/simple_mob/animal/giant_spider/carrier //Disrupter, old 100
maxHealth = 30
health = 30
melee_damage_lower = 4
melee_damage_upper = 12
/mob/living/simple_mob/animal/giant_spider/electric //disrupter, old 210
maxHealth = 30
health = 30
projectiletype = /obj/item/projectile/energy/mob/electric_spider
melee_damage_lower = 5
melee_damage_upper = 12
/mob/living/simple_mob/animal/giant_spider/frost //tank, old 175
maxHealth = 60
health = 60
/mob/living/simple_mob/animal/giant_spider //tank, old 200
maxHealth = 60
health = 60
melee_damage_lower = 9
melee_damage_upper = 15
/mob/living/simple_mob/animal/giant_spider/ion //disrupter, old 90
maxHealth = 30
health = 30
/mob/living/simple_mob/animal/giant_spider/hunter //disrupter, old 120
maxHealth = 30
health = 30
/mob/living/simple_mob/animal/giant_spider/lurker //disrupter, old 100
maxHealth = 30
health = 30
/mob/living/simple_mob/animal/giant_spider/pepper //tank, old 210
maxHealth = 60
health = 60
/mob/living/simple_mob/animal/giant_spider/phorogenic //tank, old 225
maxHealth = 60
health = 60
melee_damage_lower = 12
melee_damage_upper = 20
/mob/living/simple_mob/animal/giant_spider/thermic //tank, old 175
maxHealth = 60
health = 60
melee_damage_lower = 5
melee_damage_upper = 12
/mob/living/simple_mob/animal/giant_spider/tunneler //disrupter, old 120
maxHealth = 30
health = 30
/mob/living/simple_mob/animal/giant_spider/webslinger //disrupter, old 90
maxHealth = 30
health = 30
/obj/effect/spider/eggcluster
spider_type = /obj/effect/spider/spiderling/varied
/mob/living/simple_mob/animal/giant_spider/broodmother
maxHealth = 400
health = 400
melee_damage_lower = 12
melee_damage_upper = 20
/mob/living/simple_mob/animal/giant_spider/frost/broodling
maxHealth = 20
health = 20
melee_damage_lower = 5
melee_damage_upper = 7
/mob/living/simple_mob/animal/giant_spider/electric/broodling
maxHealth = 15
health = 15
/mob/living/simple_mob/animal/giant_spider/hunter/broodling
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/lurker/broodling
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/nurse/broodling
maxHealth = 30
health = 30
/mob/living/simple_mob/animal/giant_spider/pepper/broodling
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/thermic/broodling
maxHealth = 20
health = 20
melee_damage_lower = 5
melee_damage_upper = 7
/mob/living/simple_mob/animal/giant_spider/tunneler/broodling
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/webslinger/broodling
maxHealth = 15
health = 15
/mob/living/simple_mob/animal/giant_spider/broodling
maxHealth = 30
health = 30
melee_damage_lower = 5
melee_damage_upper = 10
//Hijacking this file to make new event spiders
/mob/living/simple_mob/animal/giant_spider/frost/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 20
health = 20
melee_damage_lower = 5
melee_damage_upper = 7
/mob/living/simple_mob/animal/giant_spider/electric/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 15
health = 15
/mob/living/simple_mob/animal/giant_spider/hunter/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/lurker/space
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/nurse/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
egg_type = /obj/effect/spider/eggcluster/royal/space
maxHealth = 30
health = 30
/mob/living/simple_mob/animal/giant_spider/pepper/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/thermic/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 20
health = 20
melee_damage_lower = 5
melee_damage_upper = 7
/mob/living/simple_mob/animal/giant_spider/tunneler/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 20
health = 20
/mob/living/simple_mob/animal/giant_spider/webslinger/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 15
health = 15
/mob/living/simple_mob/animal/giant_spider/space
name = "giant space spider"
min_oxy = 0
max_tox = 0
max_co2 = 0
maxHealth = 30
health = 30
melee_damage_lower = 5
melee_damage_upper = 10
@@ -1,313 +1,313 @@
/datum/category_item/catalogue/fauna/alchemistbee
name = "VR Creations"
desc = "A creature made of hardlight. \
There appears to be remnants of code within the strange construct, \
of dialog, and player interaction. But all that code seems inactive"
value = CATALOGUER_REWARD_HARD
/mob/living/simple_mob/vr/alchemistbee
name = "large hardlight creature"
desc = "A digital creature"
icon = 'modular_chomp/icons/mob/alchemistbee.dmi'
icon_state = "beeliving"
icon_living = "beeliving"
icon_dead = "beedead"
catalogue_data = list(/datum/category_item/catalogue/fauna/alchemistbee)
faction = "terror" //Ai seemed bugged during test, and it fighting the book bats might be niche but nice
maxHealth = 250
health = 250
movement_cooldown = 0
unsuitable_atoms_damage = 0
projectiletype = /obj/item/projectile/energy/homing_bolt/wizard/boss
melee_attack_delay = 1 SECOND
ai_holder_type = /datum/ai_holder/simple_mob/intentional/alchemistbee
melee_damage_lower = 20
melee_damage_upper = 20
special_attack_min_range = 1
special_attack_max_range = 14
special_attack_cooldown = 10
loot_list = list(/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/weapon/gun/magic/firestaff/vrwizard/nuclear = 100,
/obj/item/clothing/head/darkvrwizard = 100,
/obj/item/clothing/suit/darkvrwizard = 100
)
/mob/living/simple_mob/vr/alchemistbee
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
//bluenom
/mob/living/simple_mob/vr/alchemistbee/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/vr/alchemistbee/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/vr/alchemistbee/init_vore()
if(!voremob_loaded)
return
.=..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The fearsome predator 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 your 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!")
/obj/item/projectile/energy/homing_bolt/wizard/boss
damage = 10
modifier_type_to_apply = /datum/modifier/wizweakness
modifier_duration = 30 SECONDS
icon_state = "arcane_barrage"
/datum/modifier/wizweakness
name = "wizweakness"
desc = "Can you even see this in game?"
mob_overlay_state = "cult_aura"
on_created_text = "<span class='warning'>You feel incrediably vulnerable.</span>"
on_expired_text = "<span class='notice'>You feel better.</span>"
stacks = MODIFIER_STACK_ALLOWED // Multiple instances will hurt a lot.
incoming_damage_percent = 2 // Adjusts all incoming damage.
incoming_brute_damage_percent = 2 // Only affects bruteloss.
incoming_fire_damage_percent = 2 // Only affects fireloss.
incoming_tox_damage_percent = 2 // Only affects toxloss.
incoming_oxy_damage_percent = 2 // Only affects oxyloss.
//Trying to learn from the AADG's ai and make my own
/datum/ai_holder/simple_mob/intentional/alchemistbee
conserve_ammo = FALSE
vision_range = 16
var/closest_desired_distance = 3 // Otherwise run up to them to be able to potentially shock or punch them.
var/chemblast_radius = 4 // How big to assume electric defense's area is.
var/dangerbolt_radius = 2 // Same but for microsingulo pull.
var/homingcluster_radius = 2 // Explosion radius for the rockets.
var/chemblast_threshold = 3 // How many non-targeted people are needed in close proximity before electric defense is viable.
var/dangerbolt_threshold = 1 // Similar to above, but uses an area around the target.
/datum/ai_holder/simple_mob/intentional/alchemistbee/on_engagement(atom/A)
// Make the AI backpeddle if using an AoE special attack.
var/list/risky_intents = list(I_GRAB, I_HURT) // Mini-singulo and missiles.
if(holder.a_intent in risky_intents)
var/closest_distance = 3
switch(holder.a_intent) // Plus one just in case.
if(I_HURT)
closest_distance = homingcluster_radius + 3
if(I_GRAB)
closest_distance = dangerbolt_radius + 3
if(get_dist(holder, A) <= closest_distance)
holder.IMove(get_step_away(holder, A, closest_distance))
// Otherwise get up close and personal.
else if(get_dist(holder, A) > closest_desired_distance)
holder.IMove(get_step_towards(holder, A))
/datum/ai_holder/simple_mob/intentional/alchemistbee/pre_special_attack(atom/A)
if(isliving(A))
var/mob/living/target = A
// If we're surrounded, Electric Defense will quickly fix that.
var/tally = 0
var/list/potential_targets = list_targets() // Returns list of mobs and certain objects like mechs and turrets.
for(var/atom/movable/AM in potential_targets)
if(get_dist(holder, AM) > chemblast_radius)
continue
if(!can_attack(AM))
continue
tally++
// Should we shock them?
if(tally >= chemblast_threshold || get_dist(target, holder) <= chemblast_radius)
holder.a_intent = I_DISARM
return
for(var/atom/movable/AM in potential_targets)
if(get_dist(target, AM) > dangerbolt_radius)
continue
if(!can_attack(AM))
continue
if(AM.anchored)
tally--
else
tally++
if(tally >= dangerbolt_threshold)
holder.a_intent = I_GRAB
else
holder.a_intent = I_HURT
else
if(get_dist(holder, A) >= homingcluster_radius + 1)
holder.a_intent = I_HURT
else
holder.a_intent = I_DISARM
/mob/living/simple_mob/vr/alchemistbee/do_special_attack(atom/A)
. = TRUE
switch(a_intent)
if(I_DISARM)
chemblast(A)
if(I_HURT)
homingcluster(A)
if(I_GRAB)
dangerbolt(A)
/mob/living/simple_mob/vr/alchemistbee/proc/chemblast(atom/target)
set waitfor = FALSE
Beam(target, icon_state = "sat_beam", time = 1.5 SECONDS, maxdistance = INFINITY)
visible_message(span("warning", "\The [src] prepares a pouch of vials!"))
sleep(0.5 SECONDS)
if(prob(25))
visible_message(span("warning", "\The [src] throws a blue vial!"))
var/obj/item/projectile/B = new /obj/item/projectile/arc/vial/frostvial(get_turf(src))
B.launch_projectile(target, BP_TORSO, src)
if(prob(25))
visible_message(span("warning", "\The [src] throws a green vial!"))
var/obj/item/projectile/B = new /obj/item/projectile/arc/vial/poisonvial(get_turf(src))
B.launch_projectile(target, BP_TORSO, src)
if(prob(25))
visible_message(span("warning", "\The [src] throws a red vial!"))
var/obj/item/projectile/B = new /obj/item/projectile/arc/vial/firevial(get_turf(src))
B.launch_projectile(target, BP_TORSO, src)
else
visible_message(span("warning", "\The [src] throws a strange vial"))
var/obj/item/projectile/A = new /obj/item/projectile/arc/vial/lightingvial(get_turf(src))
A.launch_projectile(target, BP_TORSO, src)
visible_message(span("warning", "\The [src] puts them pouch away."))
/mob/living/simple_mob/vr/alchemistbee/proc/homingcluster(atom/target)
var/obj/item/projectile/A = new /obj/item/projectile/bullet/homingcluster(get_turf(src))
A.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vr/alchemistbee/proc/dangerbolt(atom/target)
visible_message(span("warning", "\The [src] prepares a powerful spell!"))
Beam(target, icon_state = "sat_beam", time = 2.0 SECONDS, maxdistance = INFINITY)
sleep(1.5 SECONDS)
var/obj/item/projectile/A = new /obj/item/projectile/energy/nuclearblast(get_turf(src))
A.launch_projectile(target, BP_TORSO, src)
/obj/item/projectile/bullet/homingcluster
use_submunitions = 1
only_submunitions = 1
range = 0
embed_chance = 0
submunition_spread_max = 1200
submunition_spread_min = 200
submunitions = list(/obj/item/projectile/energy/homing_bolt/wizard/fire = 1, /obj/item/projectile/energy/homing_bolt/wizard/frost = 1, /obj/item/projectile/energy/homing_bolt/wizard/poison = 1, /obj/item/projectile/energy/homing_bolt/wizard/lighting = 1)
//I desire arcing projectiles with smoke. Wish this was a general proc for projectiles
/obj/item/projectile/arc/vial
name = "vial"
icon = 'modular_chomp/icons/obj/vialprojectile.dmi'
icon_state = "blue_vial"
var/splatter = FALSE // Will this make a cloud of reagents?
var/splatter_volume = 5 // The volume of its chemical container, for said cloud of reagents.
var/list/my_chems = list("mold")
/obj/item/projectile/arc/vial/on_impact(var/atom/A)
if(splatter)
var/turf/location = get_turf(src)
var/datum/effect/effect/system/smoke_spread/chem/blob/S = new /datum/effect/effect/system/smoke_spread/chem/blob
S.attach(location)
S.set_up(reagents, rand(1, splatter_volume), 0, location)
playsound(location, 'sound/effects/slime_squish.ogg', 30, 1, -3)
spawn(0)
S.start()
..()
/obj/item/projectile/arc/vial/proc/ready_chemicals()
if(reagents)
var/reagent_vol = (round((splatter_volume / my_chems.len) * 100) / 100) //Cut it at the hundreds place, please.
for(var/reagent in my_chems)
reagents.add_reagent(reagent, reagent_vol)
/obj/item/projectile/arc/vial/frostvial
icon_state = "blue_vial"
damage = 10
armor_penetration = 0
damage_type = BRUTE
splatter_volume = 60
my_chems = list("frostoil")
modifier_type_to_apply = /datum/modifier/wizpoison/frost
modifier_duration = 15 SECONDS
splatter = TRUE
/obj/item/projectile/arc/vial/poisonvial
icon_state = "green_vial"
damage = 10
armor_penetration = 0
damage_type = BRUTE
splatter_volume = 60
my_chems = list("toxin")
modifier_type_to_apply = /datum/modifier/wizpoison
modifier_duration = 15 SECONDS
splatter = TRUE
/obj/item/projectile/arc/vial/firevial
icon_state = "red_vial"
damage = 10
armor_penetration = 0
damage_type = BRUTE
splatter_volume = 60
my_chems = list("sacid")
modifier_type_to_apply = /datum/modifier/wizfire
modifier_duration = 15 SECONDS
splatter = TRUE
/obj/item/projectile/arc/vial/lightingvial
icon_state = "orange_vial"
damage = 10
armor_penetration = 0
damage_type = BRUTE
splatter_volume = 60
my_chems = list("shredding_nanites")
modifier_type_to_apply = /datum/modifier/wizfire/lighting
modifier_duration = 15 SECONDS
splatter = TRUE
/obj/item/projectile/energy/nuclearblast
name = "nuclear blast"
icon_state = "plasma"
damage = 25
armor_penetration = 50
damage_type = BURN
check_armour = "energy"
agony = 50
speed = 24.0
modifier_type_to_apply = /datum/modifier/grievous_wounds
modifier_duration = 120 SECONDS
/datum/category_item/catalogue/fauna/alchemistbee
name = "VR Creations"
desc = "A creature made of hardlight. \
There appears to be remnants of code within the strange construct, \
of dialog, and player interaction. But all that code seems inactive"
value = CATALOGUER_REWARD_HARD
/mob/living/simple_mob/vr/alchemistbee
name = "large hardlight creature"
desc = "A digital creature"
icon = 'modular_chomp/icons/mob/alchemistbee.dmi'
icon_state = "beeliving"
icon_living = "beeliving"
icon_dead = "beedead"
catalogue_data = list(/datum/category_item/catalogue/fauna/alchemistbee)
faction = "terror" //Ai seemed bugged during test, and it fighting the book bats might be niche but nice
maxHealth = 250
health = 250
movement_cooldown = 0
unsuitable_atoms_damage = 0
projectiletype = /obj/item/projectile/energy/homing_bolt/wizard/boss
melee_attack_delay = 1 SECOND
ai_holder_type = /datum/ai_holder/simple_mob/intentional/alchemistbee
melee_damage_lower = 20
melee_damage_upper = 20
special_attack_min_range = 1
special_attack_max_range = 14
special_attack_cooldown = 10
loot_list = list(/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/weapon/gun/magic/firestaff/vrwizard/nuclear = 100,
/obj/item/clothing/head/darkvrwizard = 100,
/obj/item/clothing/suit/darkvrwizard = 100
)
/mob/living/simple_mob/vr/alchemistbee
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
//bluenom
/mob/living/simple_mob/vr/alchemistbee/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/vr/alchemistbee/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/vr/alchemistbee/init_vore()
if(!voremob_loaded)
return
.=..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The fearsome predator 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 your 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!")
/obj/item/projectile/energy/homing_bolt/wizard/boss
damage = 10
modifier_type_to_apply = /datum/modifier/wizweakness
modifier_duration = 30 SECONDS
icon_state = "arcane_barrage"
/datum/modifier/wizweakness
name = "wizweakness"
desc = "Can you even see this in game?"
mob_overlay_state = "cult_aura"
on_created_text = "<span class='warning'>You feel incrediably vulnerable.</span>"
on_expired_text = "<span class='notice'>You feel better.</span>"
stacks = MODIFIER_STACK_ALLOWED // Multiple instances will hurt a lot.
incoming_damage_percent = 2 // Adjusts all incoming damage.
incoming_brute_damage_percent = 2 // Only affects bruteloss.
incoming_fire_damage_percent = 2 // Only affects fireloss.
incoming_tox_damage_percent = 2 // Only affects toxloss.
incoming_oxy_damage_percent = 2 // Only affects oxyloss.
//Trying to learn from the AADG's ai and make my own
/datum/ai_holder/simple_mob/intentional/alchemistbee
conserve_ammo = FALSE
vision_range = 16
var/closest_desired_distance = 3 // Otherwise run up to them to be able to potentially shock or punch them.
var/chemblast_radius = 4 // How big to assume electric defense's area is.
var/dangerbolt_radius = 2 // Same but for microsingulo pull.
var/homingcluster_radius = 2 // Explosion radius for the rockets.
var/chemblast_threshold = 3 // How many non-targeted people are needed in close proximity before electric defense is viable.
var/dangerbolt_threshold = 1 // Similar to above, but uses an area around the target.
/datum/ai_holder/simple_mob/intentional/alchemistbee/on_engagement(atom/A)
// Make the AI backpeddle if using an AoE special attack.
var/list/risky_intents = list(I_GRAB, I_HURT) // Mini-singulo and missiles.
if(holder.a_intent in risky_intents)
var/closest_distance = 3
switch(holder.a_intent) // Plus one just in case.
if(I_HURT)
closest_distance = homingcluster_radius + 3
if(I_GRAB)
closest_distance = dangerbolt_radius + 3
if(get_dist(holder, A) <= closest_distance)
holder.IMove(get_step_away(holder, A, closest_distance))
// Otherwise get up close and personal.
else if(get_dist(holder, A) > closest_desired_distance)
holder.IMove(get_step_towards(holder, A))
/datum/ai_holder/simple_mob/intentional/alchemistbee/pre_special_attack(atom/A)
if(isliving(A))
var/mob/living/target = A
// If we're surrounded, Electric Defense will quickly fix that.
var/tally = 0
var/list/potential_targets = list_targets() // Returns list of mobs and certain objects like mechs and turrets.
for(var/atom/movable/AM in potential_targets)
if(get_dist(holder, AM) > chemblast_radius)
continue
if(!can_attack(AM))
continue
tally++
// Should we shock them?
if(tally >= chemblast_threshold || get_dist(target, holder) <= chemblast_radius)
holder.a_intent = I_DISARM
return
for(var/atom/movable/AM in potential_targets)
if(get_dist(target, AM) > dangerbolt_radius)
continue
if(!can_attack(AM))
continue
if(AM.anchored)
tally--
else
tally++
if(tally >= dangerbolt_threshold)
holder.a_intent = I_GRAB
else
holder.a_intent = I_HURT
else
if(get_dist(holder, A) >= homingcluster_radius + 1)
holder.a_intent = I_HURT
else
holder.a_intent = I_DISARM
/mob/living/simple_mob/vr/alchemistbee/do_special_attack(atom/A)
. = TRUE
switch(a_intent)
if(I_DISARM)
chemblast(A)
if(I_HURT)
homingcluster(A)
if(I_GRAB)
dangerbolt(A)
/mob/living/simple_mob/vr/alchemistbee/proc/chemblast(atom/target)
set waitfor = FALSE
Beam(target, icon_state = "sat_beam", time = 1.5 SECONDS, maxdistance = INFINITY)
visible_message(span("warning", "\The [src] prepares a pouch of vials!"))
sleep(0.5 SECONDS)
if(prob(25))
visible_message(span("warning", "\The [src] throws a blue vial!"))
var/obj/item/projectile/B = new /obj/item/projectile/arc/vial/frostvial(get_turf(src))
B.launch_projectile(target, BP_TORSO, src)
if(prob(25))
visible_message(span("warning", "\The [src] throws a green vial!"))
var/obj/item/projectile/B = new /obj/item/projectile/arc/vial/poisonvial(get_turf(src))
B.launch_projectile(target, BP_TORSO, src)
if(prob(25))
visible_message(span("warning", "\The [src] throws a red vial!"))
var/obj/item/projectile/B = new /obj/item/projectile/arc/vial/firevial(get_turf(src))
B.launch_projectile(target, BP_TORSO, src)
else
visible_message(span("warning", "\The [src] throws a strange vial"))
var/obj/item/projectile/A = new /obj/item/projectile/arc/vial/lightingvial(get_turf(src))
A.launch_projectile(target, BP_TORSO, src)
visible_message(span("warning", "\The [src] puts them pouch away."))
/mob/living/simple_mob/vr/alchemistbee/proc/homingcluster(atom/target)
var/obj/item/projectile/A = new /obj/item/projectile/bullet/homingcluster(get_turf(src))
A.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vr/alchemistbee/proc/dangerbolt(atom/target)
visible_message(span("warning", "\The [src] prepares a powerful spell!"))
Beam(target, icon_state = "sat_beam", time = 2.0 SECONDS, maxdistance = INFINITY)
sleep(1.5 SECONDS)
var/obj/item/projectile/A = new /obj/item/projectile/energy/nuclearblast(get_turf(src))
A.launch_projectile(target, BP_TORSO, src)
/obj/item/projectile/bullet/homingcluster
use_submunitions = 1
only_submunitions = 1
range = 0
embed_chance = 0
submunition_spread_max = 1200
submunition_spread_min = 200
submunitions = list(/obj/item/projectile/energy/homing_bolt/wizard/fire = 1, /obj/item/projectile/energy/homing_bolt/wizard/frost = 1, /obj/item/projectile/energy/homing_bolt/wizard/poison = 1, /obj/item/projectile/energy/homing_bolt/wizard/lighting = 1)
//I desire arcing projectiles with smoke. Wish this was a general proc for projectiles
/obj/item/projectile/arc/vial
name = "vial"
icon = 'modular_chomp/icons/obj/vialprojectile.dmi'
icon_state = "blue_vial"
var/splatter = FALSE // Will this make a cloud of reagents?
var/splatter_volume = 5 // The volume of its chemical container, for said cloud of reagents.
var/list/my_chems = list("mold")
/obj/item/projectile/arc/vial/on_impact(var/atom/A)
if(splatter)
var/turf/location = get_turf(src)
var/datum/effect/effect/system/smoke_spread/chem/blob/S = new /datum/effect/effect/system/smoke_spread/chem/blob
S.attach(location)
S.set_up(reagents, rand(1, splatter_volume), 0, location)
playsound(location, 'sound/effects/slime_squish.ogg', 30, 1, -3)
spawn(0)
S.start()
..()
/obj/item/projectile/arc/vial/proc/ready_chemicals()
if(reagents)
var/reagent_vol = (round((splatter_volume / my_chems.len) * 100) / 100) //Cut it at the hundreds place, please.
for(var/reagent in my_chems)
reagents.add_reagent(reagent, reagent_vol)
/obj/item/projectile/arc/vial/frostvial
icon_state = "blue_vial"
damage = 10
armor_penetration = 0
damage_type = BRUTE
splatter_volume = 60
my_chems = list("frostoil")
modifier_type_to_apply = /datum/modifier/wizpoison/frost
modifier_duration = 15 SECONDS
splatter = TRUE
/obj/item/projectile/arc/vial/poisonvial
icon_state = "green_vial"
damage = 10
armor_penetration = 0
damage_type = BRUTE
splatter_volume = 60
my_chems = list("toxin")
modifier_type_to_apply = /datum/modifier/wizpoison
modifier_duration = 15 SECONDS
splatter = TRUE
/obj/item/projectile/arc/vial/firevial
icon_state = "red_vial"
damage = 10
armor_penetration = 0
damage_type = BRUTE
splatter_volume = 60
my_chems = list("sacid")
modifier_type_to_apply = /datum/modifier/wizfire
modifier_duration = 15 SECONDS
splatter = TRUE
/obj/item/projectile/arc/vial/lightingvial
icon_state = "orange_vial"
damage = 10
armor_penetration = 0
damage_type = BRUTE
splatter_volume = 60
my_chems = list("shredding_nanites")
modifier_type_to_apply = /datum/modifier/wizfire/lighting
modifier_duration = 15 SECONDS
splatter = TRUE
/obj/item/projectile/energy/nuclearblast
name = "nuclear blast"
icon_state = "plasma"
damage = 25
armor_penetration = 50
damage_type = BURN
check_armour = "energy"
agony = 50
speed = 24.0
modifier_type_to_apply = /datum/modifier/grievous_wounds
modifier_duration = 120 SECONDS
flash_strength = 15
File diff suppressed because it is too large Load Diff
@@ -1,326 +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 = 25
health = 25
movement_cooldown = 0
unsuitable_atoms_damage = 0
projectiletype = /obj/item/projectile/energy/homing_bolt
melee_attack_delay = 4 SECOND
melee_damage_lower = 12
melee_damage_upper = 12
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 = 75
health = 75
movement_cooldown = 0
unsuitable_atoms_damage = 0
projectiletype = /obj/item/projectile/energy/homing_bolt
melee_attack_delay = 4 SECOND
melee_damage_lower = 12
melee_damage_upper = 12
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 = 100
health = 100
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 = 12
melee_damage_upper = 12
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 = 100
health = 100
movement_cooldown = 0
unsuitable_atoms_damage = 0
projectiletype = null
melee_attack_delay = 4 SECOND
wreckage = null
pilot_type = null
melee_damage_lower = 12
melee_damage_upper = 12
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 = 25
health = 25
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 = 5
melee_damage_upper = 20
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 = 150
health = 150
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 = 150
health = 150
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
/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 = 25
health = 25
movement_cooldown = 0
unsuitable_atoms_damage = 0
projectiletype = /obj/item/projectile/energy/homing_bolt
melee_attack_delay = 4 SECOND
melee_damage_lower = 12
melee_damage_upper = 12
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 = 75
health = 75
movement_cooldown = 0
unsuitable_atoms_damage = 0
projectiletype = /obj/item/projectile/energy/homing_bolt
melee_attack_delay = 4 SECOND
melee_damage_lower = 12
melee_damage_upper = 12
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 = 100
health = 100
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 = 12
melee_damage_upper = 12
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 = 100
health = 100
movement_cooldown = 0
unsuitable_atoms_damage = 0
projectiletype = null
melee_attack_delay = 4 SECOND
wreckage = null
pilot_type = null
melee_damage_lower = 12
melee_damage_upper = 12
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 = 25
health = 25
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 = 5
melee_damage_upper = 20
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 = 150
health = 150
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 = 150
health = 150
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
@@ -1,214 +1,214 @@
/datum/category_item/catalogue/fauna/vrerror
name = "VR Creations"
desc = "Upon investigation of the strange creatures, they appear \
to be constructed of hardlight technology, with connections to common \
VR equipment. It is unknown what their purpose is at this time."
value = CATALOGUER_REWARD_MEDIUM
/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"
catalogue_data = list(/datum/category_item/catalogue/fauna/vrerror)
mob_class = MOB_CLASS_ABERRATION
faction = "vr"
maxHealth = 40
health = 40
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 = "hardlight creation fire"
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 = "hardlight creation poison"
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 = "hardlight creation lighting"
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 = "hardlight creation frost"
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 = "hardlight creation doomknight"
projectiletype = null
maxHealth = 70
health = 70
movement_cooldown = 4
unsuitable_atoms_damage = 0
projectiletype = null
melee_attack_delay = 8 SECOND
melee_damage_lower = 30
melee_damage_upper = 30
/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
speed = 1.0
/obj/item/projectile/energy/homing_bolt/wizard/fire
modifier_type_to_apply = /datum/modifier/wizfire
modifier_duration = 6 SECONDS
icon_state = "fireball2"
/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
icon_state = "green_pellet"
/obj/item/projectile/energy/homing_bolt/wizard/frost
modifier_type_to_apply = /datum/modifier/wizpoison/frost
modifier_duration = 6 SECONDS
icon_state = "ice_2"
/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 = 1.5
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 = 1.0
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
/datum/category_item/catalogue/fauna/vrerror
name = "VR Creations"
desc = "Upon investigation of the strange creatures, they appear \
to be constructed of hardlight technology, with connections to common \
VR equipment. It is unknown what their purpose is at this time."
value = CATALOGUER_REWARD_MEDIUM
/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"
catalogue_data = list(/datum/category_item/catalogue/fauna/vrerror)
mob_class = MOB_CLASS_ABERRATION
faction = "vr"
maxHealth = 40
health = 40
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 = "hardlight creation fire"
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 = "hardlight creation poison"
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 = "hardlight creation lighting"
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 = "hardlight creation frost"
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 = "hardlight creation doomknight"
projectiletype = null
maxHealth = 70
health = 70
movement_cooldown = 4
unsuitable_atoms_damage = 0
projectiletype = null
melee_attack_delay = 8 SECOND
melee_damage_lower = 30
melee_damage_upper = 30
/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
speed = 1.0
/obj/item/projectile/energy/homing_bolt/wizard/fire
modifier_type_to_apply = /datum/modifier/wizfire
modifier_duration = 6 SECONDS
icon_state = "fireball2"
/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
icon_state = "green_pellet"
/obj/item/projectile/energy/homing_bolt/wizard/frost
modifier_type_to_apply = /datum/modifier/wizpoison/frost
modifier_duration = 6 SECONDS
icon_state = "ice_2"
/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 = 1.5
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 = 1.0
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
@@ -1,233 +1,233 @@
/mob/living/simple_mob/humanoid/cultist/magus/rift
name = "Rift Magus"
maxHealth = 225 //Boss Mobs should be tanky.
health = 225
melee_damage_lower = 15
melee_damage_upper = 22
attack_armor_pen = 50
heat_resist = 1
cold_resist = 1
movement_cooldown = -1.5
projectiletype = /obj/item/projectile/energy/plasma/vepr/inversion
melee_attack_delay = 4 SECOND
ranged_attack_delay = 1.5 SECONDS
special_attack_min_range = 1
special_attack_max_range = 7
special_attack_cooldown = 7 SECONDS
icon_state = "void-magnus"
icon_living = "void-magnus"
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
vore_active = 1
vore_capacity = 6
vore_bump_chance = 20
size_multiplier = 1.10
faction = "demon"
damage_fatigue_mult = 0.5 // We don't want to give them a flat, huge boost to attack speed, but at the same time, make them fight harder the closer they are to dying.
injury_enrages = TRUE
armor_soak = list(
"melee" = 2,
"bullet" = 2,
"laser" = 2,
"energy" = 2,
"bomb" = 0,
"bio" = 0,
"rad" = 0
)
loot_list = list(/obj/item/clothing/head/culthood/void = 100,
/obj/item/clothing/suit/cultrobes/void = 100,
/obj/item/clothing/shoes/boots/cult/void = 100,
/obj/item/clothing/gloves/tactical/void = 100,
/obj/item/weapon/melee/voidblade = 25,
/obj/item/device/soulstone = 25,
/obj/item/device/soulstone = 25,
/obj/item/device/soulstone = 25,
/obj/item/capture_crystal/demon = 25,
/obj/item/capture_crystal/wendigo = 25
)
/mob/living/simple_mob/humanoid/cultist/magus/rift/apply_melee_effects(var/atom/A)
if(isliving(A))
var/mob/living/L = A
var/leech = rand(1,100)
if(L.nutrition)
L.adjust_nutrition(-leech)
adjust_nutrition(leech)
if(prob(25))
L.adjustHalLoss(leech)
/mob/living/simple_mob/humanoid/cultist/magus/rift/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/humanoid/cultist/magus/rift/proc/launch_microsingularity(atom/target)
new /mob/living/simple_mob/vore/demonAI (src.loc)
/mob/living/simple_mob/humanoid/cultist/magus/rift/proc/electric_defense(atom/target)
var/obj/item/projectile/P = new /obj/item/projectile/energy/fireball(get_turf(src))
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/humanoid/cultist/magus/rift/proc/launch_rockets(atom/target)
if(!target)
to_chat(src, span("warning", "There's nothing to teleport to."))
return FALSE
var/list/nearby_things = range(1, target)
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/smoke_spread
s1.set_up(5, 1, T)
var/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/smoke_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()
/obj/item/weapon/grenade/spawnergrenade/riftwallers
name = "manhack delivery grenade"
spawner_type = /mob/living/simple_mob/vore/demonAI
deliveryamt = 1
icon = 'icons/obj/device.dmi'
icon_state = "implant_melted"
color = "#f50202"
/obj/item/projectile/energy/plasma/vepr/inversion
name = "inversion bolt"
damage = 20
eyeblur = 0
armor_penetration = 50
light_range = 2
light_power = -2
light_color = "#FFFFFF"
damage_type = BURN
/mob/living/simple_mob/humanoid/cultist/magus/rift
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 = SA_ICON_LIVING
can_be_drop_prey = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/cultist/magus/rift/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/humanoid/cultist/magus/rift/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/cultist/magus/rift/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.",
"Your surrondings glow with a neon red, dashes and spirals of pitch black flowing through the red gummy flesh as if it were a strange sky.",
"Your satsified predator sways their bloated gullet happily, their warm rumbling vibrarting the stomach, and by extension you.",)
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!",
"The caustic red acid splashes, and washes over your frame, your sense of smell being overwhelmed by acid and sulfur as you're turned to nutrion.",
"Every swift swap of the predator's hips sends you slamming against the glowing red sides, your vision blurring further as you contunie to weaken." ,)
//Boss loot things. Not sure if this is approriate but will be bapped if not.
/obj/item/clothing/head/culthood/void
name = "void magnus hood"
color = "#1C1C1C"
armor = list(melee = 60, bullet = 50, laser = 50, energy = 80, bomb = 30, bio = 10, rad = 10)
cold_protection = HEAD
heat_protection = HEAD
/obj/item/clothing/suit/cultrobes/void
name = "void magnus robes"
color = "#1C1C1C"
armor = list(melee = 60, bullet = 50, laser = 50, energy = 80, bomb = 30, bio = 10, rad = 10)
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
/obj/item/clothing/shoes/boots/cult/void
name = "void magnus boots"
color = "#1C1C1C"
armor = list(melee = 60, bullet = 50, laser = 50, energy = 80, bomb = 30, bio = 10, rad = 10)
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
/obj/item/clothing/gloves/tactical/void
desc = "These warm red gloves glow warmly, while making the world round them seem darker."
name = "cult gloves"
color = "#1C1C1C"
icon_state = "work"
item_state = "wgloves"
force = 10
punch_force = 8
armor = list(melee = 30, bullet = 25, laser = 25, energy = 40, bomb = 30, bio = 10, rad = 10)
/obj/item/weapon/melee/voidblade
name = "cult blade"
desc = "An arcane weapon wielded by the followers of Nar-Sie."
icon_state = "cultblade"
origin_tech = list(TECH_COMBAT = 1, TECH_ARCANE = 2)
w_class = ITEMSIZE_LARGE
force = 40
throwforce = 20
defend_chance = 25
projectile_parry_chance = 25
armor_penetration = 25
hitsound = 'sound/weapons/bladeslice.ogg'
drop_sound = 'sound/items/drop/sword.ogg'
pickup_sound = 'sound/items/pickup/sword.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
edge = TRUE
sharp = TRUE
/obj/item/capture_crystal/demon
spawn_mob_type = /mob/living/simple_mob/vore/demonAI
/obj/item/capture_crystal/wendigo
spawn_mob_type = /mob/living/simple_mob/vore/demonAI/wendigo
/mob/living/simple_mob/humanoid/cultist/magus/rift
name = "Rift Magus"
maxHealth = 225 //Boss Mobs should be tanky.
health = 225
melee_damage_lower = 15
melee_damage_upper = 22
attack_armor_pen = 50
heat_resist = 1
cold_resist = 1
movement_cooldown = -1.5
projectiletype = /obj/item/projectile/energy/plasma/vepr/inversion
melee_attack_delay = 4 SECOND
ranged_attack_delay = 1.5 SECONDS
special_attack_min_range = 1
special_attack_max_range = 7
special_attack_cooldown = 7 SECONDS
icon_state = "void-magnus"
icon_living = "void-magnus"
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
vore_active = 1
vore_capacity = 6
vore_bump_chance = 20
size_multiplier = 1.10
faction = "demon"
damage_fatigue_mult = 0.5 // We don't want to give them a flat, huge boost to attack speed, but at the same time, make them fight harder the closer they are to dying.
injury_enrages = TRUE
armor_soak = list(
"melee" = 2,
"bullet" = 2,
"laser" = 2,
"energy" = 2,
"bomb" = 0,
"bio" = 0,
"rad" = 0
)
loot_list = list(/obj/item/clothing/head/culthood/void = 100,
/obj/item/clothing/suit/cultrobes/void = 100,
/obj/item/clothing/shoes/boots/cult/void = 100,
/obj/item/clothing/gloves/tactical/void = 100,
/obj/item/weapon/melee/voidblade = 25,
/obj/item/device/soulstone = 25,
/obj/item/device/soulstone = 25,
/obj/item/device/soulstone = 25,
/obj/item/capture_crystal/demon = 25,
/obj/item/capture_crystal/wendigo = 25
)
/mob/living/simple_mob/humanoid/cultist/magus/rift/apply_melee_effects(var/atom/A)
if(isliving(A))
var/mob/living/L = A
var/leech = rand(1,100)
if(L.nutrition)
L.adjust_nutrition(-leech)
adjust_nutrition(leech)
if(prob(25))
L.adjustHalLoss(leech)
/mob/living/simple_mob/humanoid/cultist/magus/rift/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/humanoid/cultist/magus/rift/proc/launch_microsingularity(atom/target)
new /mob/living/simple_mob/vore/demonAI (src.loc)
/mob/living/simple_mob/humanoid/cultist/magus/rift/proc/electric_defense(atom/target)
var/obj/item/projectile/P = new /obj/item/projectile/energy/fireball(get_turf(src))
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/humanoid/cultist/magus/rift/proc/launch_rockets(atom/target)
if(!target)
to_chat(src, span("warning", "There's nothing to teleport to."))
return FALSE
var/list/nearby_things = range(1, target)
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/smoke_spread
s1.set_up(5, 1, T)
var/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/smoke_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()
/obj/item/weapon/grenade/spawnergrenade/riftwallers
name = "manhack delivery grenade"
spawner_type = /mob/living/simple_mob/vore/demonAI
deliveryamt = 1
icon = 'icons/obj/device.dmi'
icon_state = "implant_melted"
color = "#f50202"
/obj/item/projectile/energy/plasma/vepr/inversion
name = "inversion bolt"
damage = 20
eyeblur = 0
armor_penetration = 50
light_range = 2
light_power = -2
light_color = "#FFFFFF"
damage_type = BURN
/mob/living/simple_mob/humanoid/cultist/magus/rift
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 = SA_ICON_LIVING
can_be_drop_prey = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/cultist/magus/rift/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/humanoid/cultist/magus/rift/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/cultist/magus/rift/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.",
"Your surrondings glow with a neon red, dashes and spirals of pitch black flowing through the red gummy flesh as if it were a strange sky.",
"Your satsified predator sways their bloated gullet happily, their warm rumbling vibrarting the stomach, and by extension you.",)
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!",
"The caustic red acid splashes, and washes over your frame, your sense of smell being overwhelmed by acid and sulfur as you're turned to nutrion.",
"Every swift swap of the predator's hips sends you slamming against the glowing red sides, your vision blurring further as you contunie to weaken." ,)
//Boss loot things. Not sure if this is approriate but will be bapped if not.
/obj/item/clothing/head/culthood/void
name = "void magnus hood"
color = "#1C1C1C"
armor = list(melee = 60, bullet = 50, laser = 50, energy = 80, bomb = 30, bio = 10, rad = 10)
cold_protection = HEAD
heat_protection = HEAD
/obj/item/clothing/suit/cultrobes/void
name = "void magnus robes"
color = "#1C1C1C"
armor = list(melee = 60, bullet = 50, laser = 50, energy = 80, bomb = 30, bio = 10, rad = 10)
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
/obj/item/clothing/shoes/boots/cult/void
name = "void magnus boots"
color = "#1C1C1C"
armor = list(melee = 60, bullet = 50, laser = 50, energy = 80, bomb = 30, bio = 10, rad = 10)
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
/obj/item/clothing/gloves/tactical/void
desc = "These warm red gloves glow warmly, while making the world round them seem darker."
name = "cult gloves"
color = "#1C1C1C"
icon_state = "work"
item_state = "wgloves"
force = 10
punch_force = 8
armor = list(melee = 30, bullet = 25, laser = 25, energy = 40, bomb = 30, bio = 10, rad = 10)
/obj/item/weapon/melee/voidblade
name = "cult blade"
desc = "An arcane weapon wielded by the followers of Nar-Sie."
icon_state = "cultblade"
origin_tech = list(TECH_COMBAT = 1, TECH_ARCANE = 2)
w_class = ITEMSIZE_LARGE
force = 40
throwforce = 20
defend_chance = 25
projectile_parry_chance = 25
armor_penetration = 25
hitsound = 'sound/weapons/bladeslice.ogg'
drop_sound = 'sound/items/drop/sword.ogg'
pickup_sound = 'sound/items/pickup/sword.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
edge = TRUE
sharp = TRUE
/obj/item/capture_crystal/demon
spawn_mob_type = /mob/living/simple_mob/vore/demonAI
/obj/item/capture_crystal/wendigo
spawn_mob_type = /mob/living/simple_mob/vore/demonAI/wendigo
@@ -1,264 +1,264 @@
/mob/living/simple_mob/humanoid/cultist
maxHealth = 75
health = 75
/mob/living/simple_mob/humanoid/cultist/human
movement_cooldown = 1
melee_damage_lower = 15
melee_damage_upper = 15
/mob/living/simple_mob/humanoid/cultist/caster
movement_cooldown = 1
projectiletype = /obj/item/projectile/energy/inversion
melee_damage_lower = 7
melee_damage_upper = 7
/mob/living/simple_mob/humanoid/cultist/tesh
movement_cooldown = -1
melee_damage_lower = 7
melee_damage_upper = 7
maxHealth = 37
health = 37
/mob/living/simple_mob/humanoid/cultist/castertesh
movement_cooldown = -1
projectiletype = /obj/item/projectile/energy/inversion
melee_damage_lower = 7
melee_damage_upper = 7
maxHealth = 37
health = 37
/mob/living/simple_mob/humanoid/cultist/elite
movement_cooldown = 1
melee_damage_lower = 15
melee_damage_upper = 15
/mob/living/simple_mob/humanoid/cultist/magus
movement_cooldown = 1
projectiletype = /obj/item/projectile/energy/inversion
maxHealth = 100
health = 100
melee_damage_lower = 15
melee_damage_upper = 15
/mob/living/simple_mob/humanoid/cultist/hunter
maxHealth = 87 //Ehhh, this AI is like mini-boss at best
health = 87
movement_cooldown = 0
melee_damage_lower = 21 //Saw Cleaver Brutality
melee_damage_upper = 21
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/fireball //Teleporting Cultists, now with fireballs
name = "Burning Mage"
desc = "An indiuval wrapped up in red robes, with orange highlights, their paws glowing.."
icon_state = "fire-fluff"
icon_living = "fire-fluff"
special_attack_min_range = 4
special_attack_max_range = 7
special_attack_cooldown = 10 SECONDS
movement_cooldown = 0
harm_intent_damage = 5
melee_damage_lower = 7
melee_damage_upper = 7
ai_holder_type = /datum/ai_holder/simple_mob/ranged
projectiletype = /obj/item/projectile/energy/fireball
/mob/living/simple_mob/humanoid/cultist/noodle
name = "Converted"
desc = "An indiuval wrapped up in a makeshift rig, made from fallen cultist."
icon_state = "cobra-cultist"
icon_living = "cobra-cultist"
maxHealth = 75
health = 75
faction = "cult"
status_flags = 0
response_help = "pokes"
response_disarm = "shoves"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 7
melee_damage_upper = 7
attack_sharp = 1
attack_edge = 1
attacktext = list("slashed", "stabbed")
armor = list(melee = 60, bullet = 40, laser = 60, energy = 80, bomb = 25, bio = 100, rad = 100)
attack_sound = 'sound/weapons/rapidslice.ogg'
projectiletype = /obj/item/projectile/energy/plasma/vepr
projectilesound = 'sound/weapons/spiderlunge.ogg'
movement_cooldown = 2
ai_holder_type = /datum/ai_holder/simple_mob/ranged
/obj/item/shield_projector/rectangle/automatic/magus
name = "cult shield stone"
desc = "A stone wielded by only the most powerful of cult leaders. It projects a shield around the user."
icon = 'icons/obj/device.dmi'
icon_state = "implant_melted"
shield_health = 100
max_shield_health = 100
shield_regen_delay = 10 SECONDS
//Nibbler//
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/fireball
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 = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/fireball/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/humanoid/cultist/human/bloodjaunt/fireball/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/fireball/init_vore()
if(!voremob_loaded)
return
.=..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = " Through fire and smoke, you have been grappled and shoved head first into a gapping maw. Rippling powerful red flesh dragging deep into the mage's gullet, your frame causing their stomach is swell out against crimson robes. As you're forced to curl up in the stomach, the walls would ripple, flickers of orange dancing as they press and knead against your flesh. Laughter, and gutteral stomach noises would fill your ears as the cultist firmly kneads their hanging gutt, sloshing it further about."
B.emote_lists[DM_HOLD] = list(
"Your useless struggling and squirming only causes the cultist to pause, firmly grasping their gut and shoving down on their belly.",
"As you lay within the gullet, you would be rocked about as the cultist jaunts around the physical and redspace realm.",
"The bloated organ around you groans and rumbles, the flesh rippling as a wave of heat washes over you.",)
B.emote_lists[DM_DIGEST] = list(
"Your useless struggling would seem to just cause pleasured rubblings and cackling. The taunt stomach jostling around even further, as if attempt to encourage your squirming further.",
"Your body would be ushered upwards, you glimpsing the outside world as it looked as if you're about to be released. The cultist then gulps down, sending you plummet back down into the gullet, their taunt belly jiggling as it's walls squish firmly against you..",
"Caustic juices splash over to you as the predator's stomach sways, the belly walls rumbling and rippling as they release a loud caustic belch." ,)
/mob/living/simple_mob/humanoid/cultist/noodle
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 = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/cultist/noodle/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/humanoid/cultist/noodle/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/cultist/noodle/init_vore()
if(!voremob_loaded)
return
.=..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = " Through fire and smoke, you have been grappled and shoved head first into a gapping maw. Rippling powerful red flesh dragging deep into the mage's gullet, your frame causing their stomach is swell out against crimson robes. As you're forced to curl up in the stomach, the walls would ripple, and knead against your flesh. Laughter, and gutteral stomach noises would fill your ears as the cultist firmly kneads their hanging gut, sloshing it further about before shoving you deeper into their system, descending deep within the serpent."
B.emote_lists[DM_HOLD] = list(
"As you're forced to lay down in the gullet, you can feel each swift and strong movement of their tail. the stomach walls forcing your body to shift alongside it.",
"As you shift around, the dark red flesh would ripple, air rushing past you as the beast lets out a thunderous belch.",
"As you shift about, the beast lifts their tail and slams it down, trying to encourage you to relax. Your their's.",)
B.emote_lists[DM_DIGEST] = list(
"Your squirming and thrasing only causes the serpent to curl their tail around your frame, squeeze down on it in sync with the muscles, pressing you further into the caustic acids.",
"Your body would swish and slosh in the burbling caustic acid as it nips at your armor and flesh.",
"The serpent cultist would let out a lazy out, streching, then remebers your exsistance pressing a claw into the you shaped bulge and grumbling." ,)
//Thank you Ears for the teshari bellies
/mob/living/simple_mob/humanoid/cultist/tesh
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 = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/cultist/tesh/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/humanoid/cultist/tesh/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/cultist/tesh/init_vore()
if(!voremob_loaded)
return
.=..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "Taking advantage of your weakened state, the %pred makes their pounce! The world going dark as the ravenous Teshari forces your battered frame down their throat. It all coming to a stop as you're packed neatly into their steaming guts. Low and content chuckling barely audible over the rising cacophony of the stomach's activity."
B.emote_lists[DM_HOLD] = list(
"Your body is bounced and jostled as the %pred purses their next prey. Unimpeded by your weight and eager for more.",
"The already oprrssive hold of the %belly restrains you with a heavy clench and squeeze from the hands outside. The %pred securing their catch.",
"You're given a heavy squeeze as the stale air is forced out from the %pred giving a crass belch. Suspending you in a claustrophobic hold until the organ relaxes with more stale air filling the space.",)
B.emote_lists[DM_DIGEST] = list(
"The bubbling of the carnivorous, little predator's belly cuts off the sounds outside, the greedy walls working in and giving you a fresh coat of enzymes.",
"The %pred traces their claws over your form and sings an incantation, and you feel your strength wane as the walls work in with renewed vigor.",
"The motion of the %pred's trotting sloshes and sways you from side to side, occasionally coating you in more hot fluids! Eating away your stamina with irragular flexes to allow them to keep eating you away." ,)
/mob/living/simple_mob/humanoid/cultist/castertesh
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 = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/cultist/castertesh/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/humanoid/cultist/castertesh/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/cultist/castertesh/init_vore()
if(!voremob_loaded)
return
.=..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "Not too long after you hit the ground the caster makes their way to your fallen self. The ground below you glows a deep red and you sink through the surface, only to find yourself folded tightly in a cramped, slick, and caustic chamber! The mage's chanting barely audible over the sounds of the stomach walls making their claim."
B.emote_lists[DM_HOLD] = list(
"Your body is bounced and jostled as the %pred purses their next prey. Unimpeded by your weight and eager for more.",
"The already oprrssive hold of the %belly restrains you with a heavy clench and squeeze from the hands outside. The %pred securing their catch.",
"You're given a heavy squeeze as the stale air is forced out from the %pred giving a crass belch. Suspending you in a claustrophobic hold until the organ relaxes with more stale air filling the space.",)
B.emote_lists[DM_DIGEST] = list(
"The bubbling of the carnivorous, little predator's belly cuts off the sounds outside, the greedy walls working in and giving you a fresh coat of enzymes.",
"The %pred traces their claws over your form and sings an incantation, and you feel your strength wane as the walls work in with renewed vigor.",
"The motion of the %pred's trotting sloshes and sways you from side to side, occasionally coating you in more hot fluids! Eating away your stamina with irragular flexes to allow them to keep eating you away." ,)
/mob/living/simple_mob/humanoid/cultist
maxHealth = 75
health = 75
/mob/living/simple_mob/humanoid/cultist/human
movement_cooldown = 1
melee_damage_lower = 15
melee_damage_upper = 15
/mob/living/simple_mob/humanoid/cultist/caster
movement_cooldown = 1
projectiletype = /obj/item/projectile/energy/inversion
melee_damage_lower = 7
melee_damage_upper = 7
/mob/living/simple_mob/humanoid/cultist/tesh
movement_cooldown = -1
melee_damage_lower = 7
melee_damage_upper = 7
maxHealth = 37
health = 37
/mob/living/simple_mob/humanoid/cultist/castertesh
movement_cooldown = -1
projectiletype = /obj/item/projectile/energy/inversion
melee_damage_lower = 7
melee_damage_upper = 7
maxHealth = 37
health = 37
/mob/living/simple_mob/humanoid/cultist/elite
movement_cooldown = 1
melee_damage_lower = 15
melee_damage_upper = 15
/mob/living/simple_mob/humanoid/cultist/magus
movement_cooldown = 1
projectiletype = /obj/item/projectile/energy/inversion
maxHealth = 100
health = 100
melee_damage_lower = 15
melee_damage_upper = 15
/mob/living/simple_mob/humanoid/cultist/hunter
maxHealth = 87 //Ehhh, this AI is like mini-boss at best
health = 87
movement_cooldown = 0
melee_damage_lower = 21 //Saw Cleaver Brutality
melee_damage_upper = 21
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/fireball //Teleporting Cultists, now with fireballs
name = "Burning Mage"
desc = "An indiuval wrapped up in red robes, with orange highlights, their paws glowing.."
icon_state = "fire-fluff"
icon_living = "fire-fluff"
special_attack_min_range = 4
special_attack_max_range = 7
special_attack_cooldown = 10 SECONDS
movement_cooldown = 0
harm_intent_damage = 5
melee_damage_lower = 7
melee_damage_upper = 7
ai_holder_type = /datum/ai_holder/simple_mob/ranged
projectiletype = /obj/item/projectile/energy/fireball
/mob/living/simple_mob/humanoid/cultist/noodle
name = "Converted"
desc = "An indiuval wrapped up in a makeshift rig, made from fallen cultist."
icon_state = "cobra-cultist"
icon_living = "cobra-cultist"
maxHealth = 75
health = 75
faction = "cult"
status_flags = 0
response_help = "pokes"
response_disarm = "shoves"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 7
melee_damage_upper = 7
attack_sharp = 1
attack_edge = 1
attacktext = list("slashed", "stabbed")
armor = list(melee = 60, bullet = 40, laser = 60, energy = 80, bomb = 25, bio = 100, rad = 100)
attack_sound = 'sound/weapons/rapidslice.ogg'
projectiletype = /obj/item/projectile/energy/plasma/vepr
projectilesound = 'sound/weapons/spiderlunge.ogg'
movement_cooldown = 2
ai_holder_type = /datum/ai_holder/simple_mob/ranged
/obj/item/shield_projector/rectangle/automatic/magus
name = "cult shield stone"
desc = "A stone wielded by only the most powerful of cult leaders. It projects a shield around the user."
icon = 'icons/obj/device.dmi'
icon_state = "implant_melted"
shield_health = 100
max_shield_health = 100
shield_regen_delay = 10 SECONDS
//Nibbler//
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/fireball
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 = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/fireball/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/humanoid/cultist/human/bloodjaunt/fireball/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/fireball/init_vore()
if(!voremob_loaded)
return
.=..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = " Through fire and smoke, you have been grappled and shoved head first into a gapping maw. Rippling powerful red flesh dragging deep into the mage's gullet, your frame causing their stomach is swell out against crimson robes. As you're forced to curl up in the stomach, the walls would ripple, flickers of orange dancing as they press and knead against your flesh. Laughter, and gutteral stomach noises would fill your ears as the cultist firmly kneads their hanging gutt, sloshing it further about."
B.emote_lists[DM_HOLD] = list(
"Your useless struggling and squirming only causes the cultist to pause, firmly grasping their gut and shoving down on their belly.",
"As you lay within the gullet, you would be rocked about as the cultist jaunts around the physical and redspace realm.",
"The bloated organ around you groans and rumbles, the flesh rippling as a wave of heat washes over you.",)
B.emote_lists[DM_DIGEST] = list(
"Your useless struggling would seem to just cause pleasured rubblings and cackling. The taunt stomach jostling around even further, as if attempt to encourage your squirming further.",
"Your body would be ushered upwards, you glimpsing the outside world as it looked as if you're about to be released. The cultist then gulps down, sending you plummet back down into the gullet, their taunt belly jiggling as it's walls squish firmly against you..",
"Caustic juices splash over to you as the predator's stomach sways, the belly walls rumbling and rippling as they release a loud caustic belch." ,)
/mob/living/simple_mob/humanoid/cultist/noodle
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 = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/cultist/noodle/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/humanoid/cultist/noodle/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/cultist/noodle/init_vore()
if(!voremob_loaded)
return
.=..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = " Through fire and smoke, you have been grappled and shoved head first into a gapping maw. Rippling powerful red flesh dragging deep into the mage's gullet, your frame causing their stomach is swell out against crimson robes. As you're forced to curl up in the stomach, the walls would ripple, and knead against your flesh. Laughter, and gutteral stomach noises would fill your ears as the cultist firmly kneads their hanging gut, sloshing it further about before shoving you deeper into their system, descending deep within the serpent."
B.emote_lists[DM_HOLD] = list(
"As you're forced to lay down in the gullet, you can feel each swift and strong movement of their tail. the stomach walls forcing your body to shift alongside it.",
"As you shift around, the dark red flesh would ripple, air rushing past you as the beast lets out a thunderous belch.",
"As you shift about, the beast lifts their tail and slams it down, trying to encourage you to relax. Your their's.",)
B.emote_lists[DM_DIGEST] = list(
"Your squirming and thrasing only causes the serpent to curl their tail around your frame, squeeze down on it in sync with the muscles, pressing you further into the caustic acids.",
"Your body would swish and slosh in the burbling caustic acid as it nips at your armor and flesh.",
"The serpent cultist would let out a lazy out, streching, then remebers your exsistance pressing a claw into the you shaped bulge and grumbling." ,)
//Thank you Ears for the teshari bellies
/mob/living/simple_mob/humanoid/cultist/tesh
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 = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/cultist/tesh/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/humanoid/cultist/tesh/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/cultist/tesh/init_vore()
if(!voremob_loaded)
return
.=..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "Taking advantage of your weakened state, the %pred makes their pounce! The world going dark as the ravenous Teshari forces your battered frame down their throat. It all coming to a stop as you're packed neatly into their steaming guts. Low and content chuckling barely audible over the rising cacophony of the stomach's activity."
B.emote_lists[DM_HOLD] = list(
"Your body is bounced and jostled as the %pred purses their next prey. Unimpeded by your weight and eager for more.",
"The already oprrssive hold of the %belly restrains you with a heavy clench and squeeze from the hands outside. The %pred securing their catch.",
"You're given a heavy squeeze as the stale air is forced out from the %pred giving a crass belch. Suspending you in a claustrophobic hold until the organ relaxes with more stale air filling the space.",)
B.emote_lists[DM_DIGEST] = list(
"The bubbling of the carnivorous, little predator's belly cuts off the sounds outside, the greedy walls working in and giving you a fresh coat of enzymes.",
"The %pred traces their claws over your form and sings an incantation, and you feel your strength wane as the walls work in with renewed vigor.",
"The motion of the %pred's trotting sloshes and sways you from side to side, occasionally coating you in more hot fluids! Eating away your stamina with irragular flexes to allow them to keep eating you away." ,)
/mob/living/simple_mob/humanoid/cultist/castertesh
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 = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/cultist/castertesh/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/humanoid/cultist/castertesh/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/cultist/castertesh/init_vore()
if(!voremob_loaded)
return
.=..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "Not too long after you hit the ground the caster makes their way to your fallen self. The ground below you glows a deep red and you sink through the surface, only to find yourself folded tightly in a cramped, slick, and caustic chamber! The mage's chanting barely audible over the sounds of the stomach walls making their claim."
B.emote_lists[DM_HOLD] = list(
"Your body is bounced and jostled as the %pred purses their next prey. Unimpeded by your weight and eager for more.",
"The already oprrssive hold of the %belly restrains you with a heavy clench and squeeze from the hands outside. The %pred securing their catch.",
"You're given a heavy squeeze as the stale air is forced out from the %pred giving a crass belch. Suspending you in a claustrophobic hold until the organ relaxes with more stale air filling the space.",)
B.emote_lists[DM_DIGEST] = list(
"The bubbling of the carnivorous, little predator's belly cuts off the sounds outside, the greedy walls working in and giving you a fresh coat of enzymes.",
"The %pred traces their claws over your form and sings an incantation, and you feel your strength wane as the walls work in with renewed vigor.",
"The motion of the %pred's trotting sloshes and sways you from side to side, occasionally coating you in more hot fluids! Eating away your stamina with irragular flexes to allow them to keep eating you away." ,)
@@ -1,220 +1,220 @@
/datum/category_item/catalogue/fauna/eclipse
name = "The Eclipse"
desc = "Life on the Frontier is hard, and unregulated. Unlike life in \
more 'civlized' areas of the Galaxy, violence and piracy remain common \
this far out. The Eclipse cares naught for this, rather their attention \
shifting to the fallen kingdoms and empires of the past. \
Salavaging secerts and materials long forgotton and stiching them \
togther in new, strange creations."
value = CATALOGUER_REWARD_TRIVIAL
unlocked_by_any = list(/datum/category_item/catalogue/fauna/eclipse)
// Obtained by scanning all X.
/datum/category_item/catalogue/fauna/all_eclipse
name = "Collection - Eclipse"
desc = "You have scanned a large array of different types of eclipse memebers, \
and therefore you have been granted a large sum of points, through this \
entry."
value = CATALOGUER_REWARD_SUPERHARD
unlocked_by_all = list(
/datum/category_item/catalogue/fauna/eclipse/teslanoodle,
/datum/category_item/catalogue/fauna/eclipse/firemoff,
/datum/category_item/catalogue/fauna/eclipse/snipertesh,
/datum/category_item/catalogue/fauna/eclipse/radiation,
/datum/category_item/catalogue/fauna/eclipse/silvernoodle,
/datum/category_item/catalogue/fauna/eclipse/shotgunner,
/datum/category_item/catalogue/fauna/eclipse/bulletstorm,
/datum/category_item/catalogue/fauna/eclipse/ravanger,
/datum/category_item/catalogue/fauna/eclipse/hellhound,
/datum/category_item/catalogue/fauna/eclipse/wheel,
/datum/category_item/catalogue/fauna/eclipse/guardian,
/datum/category_item/catalogue/fauna/eclipse/pummler,
/datum/category_item/catalogue/fauna/eclipse/aeroblaster,
/datum/category_item/catalogue/fauna/eclipse/miner,
/datum/category_item/catalogue/fauna/eclipse/froststalker,
/datum/category_item/catalogue/fauna/eclipse/cryomancer
)
/mob/living/simple_mob/humanoid/eclipse/solar/teslanoodle
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/teslanoodle)
/datum/category_item/catalogue/fauna/eclipse/teslanoodle
name = "The Tesla Armor"
desc = "The tesla's units armor crackles with eletrical current. \
Manifestation of such energy seeming to be summoned at will or at \
random. This creation seems to be in a prototype phase."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/solar/firemoff
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/firemoff)
/datum/category_item/catalogue/fauna/eclipse/firemoff
name = "Eclipse Shielding"
desc = "Eclipse armor and uniform is unlike most others, seeming wide \
and varied, but in reality is simplified to two diffrent types. \
One of the Eclipse's first studies was a mix of precursor ablative and \
bullet proof technolgy. They have gotten an understanding of it, they \
are able to fuse it with many diffrent uniforms, allowing for a more \
diverse apperance."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/solar/snipertesh
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/snipertesh)
/datum/category_item/catalogue/fauna/eclipse/snipertesh
name = "Cult-like rituals"
desc = "The Eclipse started off as a strange mixutre of a friendly \
band, and lower tier orginization. as their technolgy has evolved, so did \
their behaviors. Some sects begining to worship and heavly praise the fallen \
precusor empires. Some going as far to try and revivive them, always to \
mixed results, rarely resulting in in-fighting."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/solar/radiation
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/radiation)
/datum/category_item/catalogue/fauna/eclipse/radiation
name = "Nuclear Failures"
desc = "Failure is not an option for the Eclipse. More so, failure \
is just another opportunity to learn. Their radiation units coming\
from serveral failures of nuclear power soruces alongside failures amongst, \
nuclear weaponry. Eventually creating quality weapons, and refitting their \
power sources to radiation field generators."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/silvernoodle
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/silvernoodle)
/datum/category_item/catalogue/fauna/eclipse/silvernoodle
name = "Failed Selling"
desc = "While one would think the Eclipse would become rather wealthy and \
fame from their line of work, they are instead rather average due to most \
of their products having a high chance of failure. For every working weapon, \
armor, tool, there are at least 10 failures. Resleeving and high quality \
medication are one of the few reasons they have not wiped themselves out."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/shotgunner
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/shotgunner)
/datum/category_item/catalogue/fauna/eclipse/shotgunner
name = "Specialized Arms"
desc = "The Eclipse's focus on utilizing precursor tech leads them down \
strange weaponry. Even with firearms, they are always modified slightly \
just to fufill having some form of what they see as future tech. \
Although this leads to weapon failures, or creation accidents."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/bulletstorm
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/bulletstorm)
/datum/category_item/catalogue/fauna/eclipse/bulletstorm
name = "Open Joining"
desc = "The Eclipse has many varying memebers, of all diffrent shapes, \
sizes, and heritages. This is due to a varity of factors, which includes \
high mortality rates, mutations, and body modification expermintation."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/ravanger
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/ravanger)
/datum/category_item/catalogue/fauna/eclipse/ravanger
name = "Resleeving Failures"
desc = "The Eclipse has precourdered many bits of resleeving equipment \
but like most of that comes into their grasp it has become more dangerous \
and expirmental. Corruption and malformed bodies have become common place, \
minds becoming lost. But failure is non-exsistant, instead being repurosed \
such as shaping them into ravanger units."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/solar/hellhound
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/hellhound)
/datum/category_item/catalogue/fauna/eclipse/hellhound
name = "Hellhound Units"
desc = "Equiped with specialized armor, the systems of the suit pairing \
with their nervous system in an attempt to allow for better hunting. \
Venom is found within their claws and fangs, the chemical compound being, \
akin to soporific, The hellhound units are both useful for single target \
hunting, and frontal assualt."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/wheel
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/wheel)
/datum/category_item/catalogue/fauna/eclipse/wheel
name = "Armadillo"
desc = "With several strange creatures among their ranks, the Eclipse \
has attempted strange and usual armors and tatics. With several being able \
to curl up into a ball shape, the wheel armor was created, trying to turn \
a rolling motion into an offensive force."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/solar/guardian
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/guardian)
/datum/category_item/catalogue/fauna/eclipse/guardian
name = "Slime Pits"
desc = "Another potential of failed resleeves are the slime pits, \
the failed body being merged with one of their many slimes, creating something \
akin to a promethean but having a mind more akin to a drone. Some of the \
slime creations the similiar abilties to their slime counter parts, or \
renamants of the donator's DNA."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/pummler
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/pummler)
/datum/category_item/catalogue/fauna/eclipse/pummler
name = "Hunter Unit - Pummler"
desc = "Another drone like creation, meld with alien sea life, and traces \
renamants of solar grubs. Was orginally meant for assualting mecha pilots, \
and tearing them free from the mechas, but prooved to be too variable with \
results. Instead their desgin changing to that of hunting down single \
targets across any and all terrains."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/aeroblaster
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/pummler)
/datum/category_item/catalogue/fauna/eclipse/aeroblaster
name = "Eclipse Drones"
desc = "Sometimes, the failed resleeves only leave the fragments of a mind \
behind. But even that is useful, latching onto the renamants of loyalty and \
the brain's remaining procressing power to create special circuits for, \
their drones."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/miner
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/miner)
/datum/category_item/catalogue/fauna/eclipse/miner
name = "Bio-tech Unit"
desc = "One benefit of the slime units is they're able to easily interface \
with the drone units. Cooperation is keenly unquie between the slime and \
drone units. This is espically helpful within hazardous mining conditions \
both being able to flee or alter plans as soon as either noitces."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/solar/froststalker
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/froststalker)
/datum/category_item/catalogue/fauna/eclipse/froststalker
name = "Mindless Ice"
desc = "Cryogel expermination has been one of the most active fronts, but \
with it, countless failures. Whilst not on purpose, many of their number\
have had their bodies freeze over, transforming into sentient creatures, \
of ice. Their minds sometimes lost alongside their orginal form."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/solar/cryomancer
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/cryomancer)
/datum/category_item/catalogue/fauna/eclipse/cryomancer
name = "Cryomancers"
desc = "One of the few success in the Pluto Intitative, but one that \
yields great results. Highly resistant to cold, and heat, more so then it's \
contemparies, all the while wielding expirmental frost weaponry to deadly \
effecieny. Rare and vaulable pieces in the Eclipse's army, they are rarely seen \
but when utilized, that area is of high priority. "
/datum/category_item/catalogue/fauna/eclipse
name = "The Eclipse"
desc = "Life on the Frontier is hard, and unregulated. Unlike life in \
more 'civlized' areas of the Galaxy, violence and piracy remain common \
this far out. The Eclipse cares naught for this, rather their attention \
shifting to the fallen kingdoms and empires of the past. \
Salavaging secerts and materials long forgotton and stiching them \
togther in new, strange creations."
value = CATALOGUER_REWARD_TRIVIAL
unlocked_by_any = list(/datum/category_item/catalogue/fauna/eclipse)
// Obtained by scanning all X.
/datum/category_item/catalogue/fauna/all_eclipse
name = "Collection - Eclipse"
desc = "You have scanned a large array of different types of eclipse memebers, \
and therefore you have been granted a large sum of points, through this \
entry."
value = CATALOGUER_REWARD_SUPERHARD
unlocked_by_all = list(
/datum/category_item/catalogue/fauna/eclipse/teslanoodle,
/datum/category_item/catalogue/fauna/eclipse/firemoff,
/datum/category_item/catalogue/fauna/eclipse/snipertesh,
/datum/category_item/catalogue/fauna/eclipse/radiation,
/datum/category_item/catalogue/fauna/eclipse/silvernoodle,
/datum/category_item/catalogue/fauna/eclipse/shotgunner,
/datum/category_item/catalogue/fauna/eclipse/bulletstorm,
/datum/category_item/catalogue/fauna/eclipse/ravanger,
/datum/category_item/catalogue/fauna/eclipse/hellhound,
/datum/category_item/catalogue/fauna/eclipse/wheel,
/datum/category_item/catalogue/fauna/eclipse/guardian,
/datum/category_item/catalogue/fauna/eclipse/pummler,
/datum/category_item/catalogue/fauna/eclipse/aeroblaster,
/datum/category_item/catalogue/fauna/eclipse/miner,
/datum/category_item/catalogue/fauna/eclipse/froststalker,
/datum/category_item/catalogue/fauna/eclipse/cryomancer
)
/mob/living/simple_mob/humanoid/eclipse/solar/teslanoodle
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/teslanoodle)
/datum/category_item/catalogue/fauna/eclipse/teslanoodle
name = "The Tesla Armor"
desc = "The tesla's units armor crackles with eletrical current. \
Manifestation of such energy seeming to be summoned at will or at \
random. This creation seems to be in a prototype phase."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/solar/firemoff
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/firemoff)
/datum/category_item/catalogue/fauna/eclipse/firemoff
name = "Eclipse Shielding"
desc = "Eclipse armor and uniform is unlike most others, seeming wide \
and varied, but in reality is simplified to two diffrent types. \
One of the Eclipse's first studies was a mix of precursor ablative and \
bullet proof technolgy. They have gotten an understanding of it, they \
are able to fuse it with many diffrent uniforms, allowing for a more \
diverse apperance."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/solar/snipertesh
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/snipertesh)
/datum/category_item/catalogue/fauna/eclipse/snipertesh
name = "Cult-like rituals"
desc = "The Eclipse started off as a strange mixutre of a friendly \
band, and lower tier orginization. as their technolgy has evolved, so did \
their behaviors. Some sects begining to worship and heavly praise the fallen \
precusor empires. Some going as far to try and revivive them, always to \
mixed results, rarely resulting in in-fighting."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/solar/radiation
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/radiation)
/datum/category_item/catalogue/fauna/eclipse/radiation
name = "Nuclear Failures"
desc = "Failure is not an option for the Eclipse. More so, failure \
is just another opportunity to learn. Their radiation units coming\
from serveral failures of nuclear power soruces alongside failures amongst, \
nuclear weaponry. Eventually creating quality weapons, and refitting their \
power sources to radiation field generators."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/silvernoodle
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/silvernoodle)
/datum/category_item/catalogue/fauna/eclipse/silvernoodle
name = "Failed Selling"
desc = "While one would think the Eclipse would become rather wealthy and \
fame from their line of work, they are instead rather average due to most \
of their products having a high chance of failure. For every working weapon, \
armor, tool, there are at least 10 failures. Resleeving and high quality \
medication are one of the few reasons they have not wiped themselves out."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/shotgunner
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/shotgunner)
/datum/category_item/catalogue/fauna/eclipse/shotgunner
name = "Specialized Arms"
desc = "The Eclipse's focus on utilizing precursor tech leads them down \
strange weaponry. Even with firearms, they are always modified slightly \
just to fufill having some form of what they see as future tech. \
Although this leads to weapon failures, or creation accidents."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/bulletstorm
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/bulletstorm)
/datum/category_item/catalogue/fauna/eclipse/bulletstorm
name = "Open Joining"
desc = "The Eclipse has many varying memebers, of all diffrent shapes, \
sizes, and heritages. This is due to a varity of factors, which includes \
high mortality rates, mutations, and body modification expermintation."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/ravanger
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/ravanger)
/datum/category_item/catalogue/fauna/eclipse/ravanger
name = "Resleeving Failures"
desc = "The Eclipse has precourdered many bits of resleeving equipment \
but like most of that comes into their grasp it has become more dangerous \
and expirmental. Corruption and malformed bodies have become common place, \
minds becoming lost. But failure is non-exsistant, instead being repurosed \
such as shaping them into ravanger units."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/solar/hellhound
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/hellhound)
/datum/category_item/catalogue/fauna/eclipse/hellhound
name = "Hellhound Units"
desc = "Equiped with specialized armor, the systems of the suit pairing \
with their nervous system in an attempt to allow for better hunting. \
Venom is found within their claws and fangs, the chemical compound being, \
akin to soporific, The hellhound units are both useful for single target \
hunting, and frontal assualt."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/wheel
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/wheel)
/datum/category_item/catalogue/fauna/eclipse/wheel
name = "Armadillo"
desc = "With several strange creatures among their ranks, the Eclipse \
has attempted strange and usual armors and tatics. With several being able \
to curl up into a ball shape, the wheel armor was created, trying to turn \
a rolling motion into an offensive force."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/solar/guardian
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/guardian)
/datum/category_item/catalogue/fauna/eclipse/guardian
name = "Slime Pits"
desc = "Another potential of failed resleeves are the slime pits, \
the failed body being merged with one of their many slimes, creating something \
akin to a promethean but having a mind more akin to a drone. Some of the \
slime creations the similiar abilties to their slime counter parts, or \
renamants of the donator's DNA."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/pummler
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/pummler)
/datum/category_item/catalogue/fauna/eclipse/pummler
name = "Hunter Unit - Pummler"
desc = "Another drone like creation, meld with alien sea life, and traces \
renamants of solar grubs. Was orginally meant for assualting mecha pilots, \
and tearing them free from the mechas, but prooved to be too variable with \
results. Instead their desgin changing to that of hunting down single \
targets across any and all terrains."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/aeroblaster
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/pummler)
/datum/category_item/catalogue/fauna/eclipse/aeroblaster
name = "Eclipse Drones"
desc = "Sometimes, the failed resleeves only leave the fragments of a mind \
behind. But even that is useful, latching onto the renamants of loyalty and \
the brain's remaining procressing power to create special circuits for, \
their drones."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/lunar/miner
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/miner)
/datum/category_item/catalogue/fauna/eclipse/miner
name = "Bio-tech Unit"
desc = "One benefit of the slime units is they're able to easily interface \
with the drone units. Cooperation is keenly unquie between the slime and \
drone units. This is espically helpful within hazardous mining conditions \
both being able to flee or alter plans as soon as either noitces."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/solar/froststalker
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/froststalker)
/datum/category_item/catalogue/fauna/eclipse/froststalker
name = "Mindless Ice"
desc = "Cryogel expermination has been one of the most active fronts, but \
with it, countless failures. Whilst not on purpose, many of their number\
have had their bodies freeze over, transforming into sentient creatures, \
of ice. Their minds sometimes lost alongside their orginal form."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/eclipse/solar/cryomancer
catalogue_data = list(/datum/category_item/catalogue/fauna/eclipse/cryomancer)
/datum/category_item/catalogue/fauna/eclipse/cryomancer
name = "Cryomancers"
desc = "One of the few success in the Pluto Intitative, but one that \
yields great results. Highly resistant to cold, and heat, more so then it's \
contemparies, all the while wielding expirmental frost weaponry to deadly \
effecieny. Rare and vaulable pieces in the Eclipse's army, they are rarely seen \
but when utilized, that area is of high priority. "
value = CATALOGUER_REWARD_MEDIUM
@@ -1,6 +1,6 @@
/mob/living/simple_mob/humanoid/merc/ranged/laser
projectiletype = /obj/item/projectile/energy/mob/midlaser
/mob/living/simple_mob/humanoid/merc
health = 75 // improper cloning
/mob/living/simple_mob/humanoid/merc/ranged/laser
projectiletype = /obj/item/projectile/energy/mob/midlaser
/mob/living/simple_mob/humanoid/merc
health = 75 // improper cloning
maxHealth = 75
@@ -1,15 +1,15 @@
/mob/living/simple_mob/humanoid/pirate/ranged/handcannon
projectiletype = /obj/item/projectile/energy/mob/heavylaser
/mob/living/simple_mob/humanoid/pirate/captain
projectiletype = /obj/item/projectile/energy/mob/heavylaser
/mob/living/simple_mob/humanoid/pirate
maxHealth = 75
health = 75
/mob/living/simple_mob/mechanical/mecha/ripley/pirate
maxHealth = 125
/mob/living/simple_mob/mechanical/mecha/ripley/pirate/last_stand_merc //Special version used as a quasi boss fight
/mob/living/simple_mob/humanoid/pirate/ranged/handcannon
projectiletype = /obj/item/projectile/energy/mob/heavylaser
/mob/living/simple_mob/humanoid/pirate/captain
projectiletype = /obj/item/projectile/energy/mob/heavylaser
/mob/living/simple_mob/humanoid/pirate
maxHealth = 75
health = 75
/mob/living/simple_mob/mechanical/mecha/ripley/pirate
maxHealth = 125
/mob/living/simple_mob/mechanical/mecha/ripley/pirate/last_stand_merc //Special version used as a quasi boss fight
maxHealth = 85
@@ -1,219 +1,219 @@
/mob/living/simple_mob/humanoid/starhunter/hunter/clone
name = "Avatar Of The Serpent"
icon_state = "avatar"
health = 15
maxHealth = 15
ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive/starhunter
projectiletype = /obj/item/projectile/energy/ninjastar
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar
name = "Avatar Of The Serpent"
icon_state = "avatar"
health = 1000 //50 hits from 20 damage
maxHealth = 1000 //50 hits from 20 damage
damage_fatigue_mult = 0
ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive/starhunter
special_attack_cooldown = 20 SECONDS
special_attack_min_range = 1
special_attack_max_range = 7
projectiletype = /obj/item/projectile/energy/ninjastar
digestable = 0
devourable = 0
//note to self, expand the loot list later
loot_list = list(/obj/item/weapon/storage/belt/holding = 60,
/obj/item/clothing/glasses/omni = 60,
/obj/item/weapon/kinetic_crusher/glaive = 60,
/obj/item/slime_extract/sepia = 60,
/obj/item/weapon/circuitboard/defenseonelisk = 60,
/obj/item/weapon/circuitboard/paradoxrift = 60,
/obj/item/capture_crystal = 60
)
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/updatehealth()
. = ..()
if(health < maxHealth*0.25)
special_attack_cooldown = 5 SECONDS
projectiletype = /obj/item/projectile/bullet/ninjaburst
else if(health < maxHealth*0.5)
special_attack_cooldown = 10 SECONDS
projectiletype = /obj/item/projectile/energy/kunai
else if (health < maxHealth*0.75)
special_attack_cooldown = 15 SECONDS
projectiletype = /obj/item/projectile/energy/chakaram
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/do_special_attack(atom/A)
if(health < maxHealth*0.4)
if(prob(20))
lightingstorm(A)
if(prob(20))
lightingline(A)
if(prob(20))
lightpillar(A)
if(prob(20))
clones(A)
else
rapidfire_windup(A)
else if(health < maxHealth*0.7)
if(prob(25))
lightingstorm(A)
if(prob(25))
lightingline(A)
if(prob(25))
lightpillar(A)
else
rapidfire_windup(A)
else
if(prob(50))
lightingstrike(A)
else
lightpillar(A)
/obj/item/projectile/energy/kunai //chip damage
name = "Energy Kunai"
icon = 'modular_chomp/icons/mob/starhunters.dmi' //commiting sin
icon_state = "kunai"
damage = 5
armor_penetration = 65 //Gets into the gaps
speed = 2
damage_type = BURN
check_armour = "laser"
/obj/item/projectile/energy/chakaram //slower but hits harder
name = "Energy Chakaram"
icon = 'modular_chomp/icons/mob/starhunters.dmi' //commiting sin
icon_state = "chakaram"
damage = 25
armor_penetration = 25 //Gets into the gaps
speed = 5
damage_type = BURN
check_armour = "laser"
/obj/item/projectile/bullet/ninjaburst
use_submunitions = 1
only_submunitions = 1
range = 0
embed_chance = 0
submunition_spread_max = 2600
submunition_spread_min = 150
submunitions = list(/obj/item/projectile/energy/kunai = 3, /obj/item/projectile/energy/chakaram = 1, /obj/item/projectile/energy/ninjastar = 3)
/datum/ai_holder/simple_mob/ranged/aggressive/starhunter
vision_range = 14
closest_distance = 5
returns_home = TRUE // Stay close to the base...
wander = TRUE // ... but "patrol" a little.
intelligence_level = AI_SMART // Also knows not to walk while confused if it risks death.
mauling = TRUE
call_distance = 0 //Trying to disable this for the mobs
retaliate = TRUE
hostile = FALSE
violent_breakthrough = TRUE
respect_alpha = FALSE
pointblank = TRUE
/obj/effect/calldown_attack_lighting
anchored = TRUE
density = FALSE
unacidable = TRUE
mouse_opacity = 0
icon = 'icons/effects/effects.dmi'
icon_state = "drop_marker"
/obj/effect/calldown_attack_lighting/Initialize(mapload)
..()
return INITIALIZE_HINT_LATELOAD
/obj/effect/calldown_attack_fire/LateInitialize()
var/delay = rand(25, 30)
spawn(delay-7)
lightning_strike(src.loc)
spawn(delay)
qdel(src)
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/proc/lightingstorm(atom/A)
var/list/potential_targets = ai_holder.list_targets()
for(var/atom/entry in potential_targets)
if(istype(entry, /mob/living/simple_mob/humanoid/starhunter/hunter))
potential_targets -= entry
if(potential_targets.len)
var/iteration = clamp(potential_targets.len, 1, 3)
for(var/i = 0, i < iteration, i++)
if(!(potential_targets.len))
break
var/mob/target = pick(potential_targets)
potential_targets -= target
lightingstormfollow(target)
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/proc/lightingstormfollow(atom/target)
var/list/bomb_range = block(locate(target.x-6, target.y-6, target.z), locate(target.x+6, target.y+6, target.z))
new /obj/effect/calldown_attack(get_turf(target))
bomb_range -= get_turf(target)
for(var/i = 0, i < 4, i++)
var/turf/T = pick(bomb_range)
new /obj/effect/calldown_attack_lighting(T)
bomb_range -= T
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/proc/lightingline(atom/A)
var/list/potential_targets = ai_holder.list_targets()
for(var/atom/entry in potential_targets)
if(istype(entry, /mob/living/simple_mob/humanoid/starhunter/hunter))
potential_targets -= entry
if(potential_targets.len)
var/iteration = clamp(potential_targets.len, 1, 3)
for(var/i = 0, i < iteration, i++)
if(!(potential_targets.len))
break
var/mob/target = pick(potential_targets)
potential_targets -= target
lightinglinefollow(target)
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/proc/lightinglinefollow(atom/target)
var/alignment = rand(1,2) // 1 for vertical, 2 for horizontal
var/list/line_range = list()
var/turf/T = get_turf(target)
line_range += T
for(var/i = 1, i <= 7, i++)
switch(alignment)
if(1)
if(T.x-i > 0)
line_range += locate(T.x-i, T.y, T.z)
if(T.x+i <= world.maxx)
line_range += locate(T.x+i, T.y, T.z)
if(2)
if(T.y-i > 0)
line_range += locate(T.x, T.y-i, T.z)
if(T.y+i <= world.maxy)
line_range += locate(T.x, T.y+i, T.z)
for(var/turf/dropspot in line_range)
new /obj/effect/calldown_attack_lighting(dropspot)
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/proc/clones(atom/A)
new /mob/living/simple_mob/humanoid/starhunter/hunter/clone (src.loc)
new /mob/living/simple_mob/humanoid/starhunter/hunter/clone (src.loc)
new /mob/living/simple_mob/humanoid/starhunter/hunter/clone (src.loc)
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/proc/lightingstrike(atom/A)
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)
/mob/living/simple_mob/humanoid/starhunter/hunter/clone
name = "Avatar Of The Serpent"
icon_state = "avatar"
health = 15
maxHealth = 15
ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive/starhunter
projectiletype = /obj/item/projectile/energy/ninjastar
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar
name = "Avatar Of The Serpent"
icon_state = "avatar"
health = 1000 //50 hits from 20 damage
maxHealth = 1000 //50 hits from 20 damage
damage_fatigue_mult = 0
ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive/starhunter
special_attack_cooldown = 20 SECONDS
special_attack_min_range = 1
special_attack_max_range = 7
projectiletype = /obj/item/projectile/energy/ninjastar
digestable = 0
devourable = 0
//note to self, expand the loot list later
loot_list = list(/obj/item/weapon/storage/belt/holding = 60,
/obj/item/clothing/glasses/omni = 60,
/obj/item/weapon/kinetic_crusher/glaive = 60,
/obj/item/slime_extract/sepia = 60,
/obj/item/weapon/circuitboard/defenseonelisk = 60,
/obj/item/weapon/circuitboard/paradoxrift = 60,
/obj/item/capture_crystal = 60
)
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/updatehealth()
. = ..()
if(health < maxHealth*0.25)
special_attack_cooldown = 5 SECONDS
projectiletype = /obj/item/projectile/bullet/ninjaburst
else if(health < maxHealth*0.5)
special_attack_cooldown = 10 SECONDS
projectiletype = /obj/item/projectile/energy/kunai
else if (health < maxHealth*0.75)
special_attack_cooldown = 15 SECONDS
projectiletype = /obj/item/projectile/energy/chakaram
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/do_special_attack(atom/A)
if(health < maxHealth*0.4)
if(prob(20))
lightingstorm(A)
if(prob(20))
lightingline(A)
if(prob(20))
lightpillar(A)
if(prob(20))
clones(A)
else
rapidfire_windup(A)
else if(health < maxHealth*0.7)
if(prob(25))
lightingstorm(A)
if(prob(25))
lightingline(A)
if(prob(25))
lightpillar(A)
else
rapidfire_windup(A)
else
if(prob(50))
lightingstrike(A)
else
lightpillar(A)
/obj/item/projectile/energy/kunai //chip damage
name = "Energy Kunai"
icon = 'modular_chomp/icons/mob/starhunters.dmi' //commiting sin
icon_state = "kunai"
damage = 5
armor_penetration = 65 //Gets into the gaps
speed = 2
damage_type = BURN
check_armour = "laser"
/obj/item/projectile/energy/chakaram //slower but hits harder
name = "Energy Chakaram"
icon = 'modular_chomp/icons/mob/starhunters.dmi' //commiting sin
icon_state = "chakaram"
damage = 25
armor_penetration = 25 //Gets into the gaps
speed = 5
damage_type = BURN
check_armour = "laser"
/obj/item/projectile/bullet/ninjaburst
use_submunitions = 1
only_submunitions = 1
range = 0
embed_chance = 0
submunition_spread_max = 2600
submunition_spread_min = 150
submunitions = list(/obj/item/projectile/energy/kunai = 3, /obj/item/projectile/energy/chakaram = 1, /obj/item/projectile/energy/ninjastar = 3)
/datum/ai_holder/simple_mob/ranged/aggressive/starhunter
vision_range = 14
closest_distance = 5
returns_home = TRUE // Stay close to the base...
wander = TRUE // ... but "patrol" a little.
intelligence_level = AI_SMART // Also knows not to walk while confused if it risks death.
mauling = TRUE
call_distance = 0 //Trying to disable this for the mobs
retaliate = TRUE
hostile = FALSE
violent_breakthrough = TRUE
respect_alpha = FALSE
pointblank = TRUE
/obj/effect/calldown_attack_lighting
anchored = TRUE
density = FALSE
unacidable = TRUE
mouse_opacity = 0
icon = 'icons/effects/effects.dmi'
icon_state = "drop_marker"
/obj/effect/calldown_attack_lighting/Initialize(mapload)
..()
return INITIALIZE_HINT_LATELOAD
/obj/effect/calldown_attack_fire/LateInitialize()
var/delay = rand(25, 30)
spawn(delay-7)
lightning_strike(src.loc)
spawn(delay)
qdel(src)
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/proc/lightingstorm(atom/A)
var/list/potential_targets = ai_holder.list_targets()
for(var/atom/entry in potential_targets)
if(istype(entry, /mob/living/simple_mob/humanoid/starhunter/hunter))
potential_targets -= entry
if(potential_targets.len)
var/iteration = clamp(potential_targets.len, 1, 3)
for(var/i = 0, i < iteration, i++)
if(!(potential_targets.len))
break
var/mob/target = pick(potential_targets)
potential_targets -= target
lightingstormfollow(target)
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/proc/lightingstormfollow(atom/target)
var/list/bomb_range = block(locate(target.x-6, target.y-6, target.z), locate(target.x+6, target.y+6, target.z))
new /obj/effect/calldown_attack(get_turf(target))
bomb_range -= get_turf(target)
for(var/i = 0, i < 4, i++)
var/turf/T = pick(bomb_range)
new /obj/effect/calldown_attack_lighting(T)
bomb_range -= T
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/proc/lightingline(atom/A)
var/list/potential_targets = ai_holder.list_targets()
for(var/atom/entry in potential_targets)
if(istype(entry, /mob/living/simple_mob/humanoid/starhunter/hunter))
potential_targets -= entry
if(potential_targets.len)
var/iteration = clamp(potential_targets.len, 1, 3)
for(var/i = 0, i < iteration, i++)
if(!(potential_targets.len))
break
var/mob/target = pick(potential_targets)
potential_targets -= target
lightinglinefollow(target)
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/proc/lightinglinefollow(atom/target)
var/alignment = rand(1,2) // 1 for vertical, 2 for horizontal
var/list/line_range = list()
var/turf/T = get_turf(target)
line_range += T
for(var/i = 1, i <= 7, i++)
switch(alignment)
if(1)
if(T.x-i > 0)
line_range += locate(T.x-i, T.y, T.z)
if(T.x+i <= world.maxx)
line_range += locate(T.x+i, T.y, T.z)
if(2)
if(T.y-i > 0)
line_range += locate(T.x, T.y-i, T.z)
if(T.y+i <= world.maxy)
line_range += locate(T.x, T.y+i, T.z)
for(var/turf/dropspot in line_range)
new /obj/effect/calldown_attack_lighting(dropspot)
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/proc/clones(atom/A)
new /mob/living/simple_mob/humanoid/starhunter/hunter/clone (src.loc)
new /mob/living/simple_mob/humanoid/starhunter/hunter/clone (src.loc)
new /mob/living/simple_mob/humanoid/starhunter/hunter/clone (src.loc)
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/proc/lightingstrike(atom/A)
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)
new/obj/effect/calldown_attack_lighting(target_turf)
@@ -1,156 +1,156 @@
/mob/living/simple_mob/humanoid/starhunter
name = "Starhunter Initiate"
desc = "A strange critter cladded in strange armor."
icon = 'modular_chomp/icons/mob/starhunters.dmi'
icon_state = "sun"
icon_living = "sun"
icon_dead = "statisgem"
icon_gib = "syndicate_gib"
taser_kill = 0
faction = "starhunter"
movement_cooldown = 0
status_flags = 0
response_help = "pokes"
response_disarm = "shoves"
response_harm = "hits"
health = 120 //This may be high, but intend for the combative ones to be on their own.
maxHealth = 120
harm_intent_damage = 5
melee_damage_lower = 17 //machette
melee_damage_upper = 17 //beg knife go brrr
attack_sharp = 1
attack_edge = 1
attacktext = list("slashed", "stabbed")
projectile_dispersion = 8
projectile_accuracy = -20
armor = list(melee = 40, bullet = 70, laser = 10, energy = 0, bomb = 50, bio = 100, rad = 100) // Critters are more ortiented torwards melee and bullet
ranged_cooldown = 5
ai_holder_type = /datum/ai_holder/simple_mob/starhunter
can_be_drop_prey = FALSE
pass_flags = PASSTABLE
softfall = TRUE
//spaceproofing things
minbodytemp = 0 // Minimum "okay" temperature in kelvin
maxbodytemp = 600 // Maximum of above
min_oxy = 0 // Oxygen in moles, minimum, 0 is 'no minimum'
max_oxy = 0 // Oxygen in moles, maximum, 0 is 'no maximum'
min_tox = 0 // Phoron min
max_tox = 0 // Phoron max
min_co2 = 0 // CO2 min
max_co2 = 0 // CO2 max
min_n2 = 0 // N2 min
max_n2 = 0
/datum/ai_holder/simple_mob/starhunter
returns_home = TRUE // Stay close to the base...
wander = TRUE // ... but "patrol" a little.
intelligence_level = AI_SMART // Also knows not to walk while confused if it risks death.
can_flee = TRUE // If they're even allowed to flee.
flee_when_dying = TRUE // If they should flee when low on health.
dying_threshold = 0.2 // How low on health the holder needs to be before fleeing. Defaults to 30% or lower health.
mauling = TRUE
call_distance = 0 //Trying to disable this for the mobs
vision_range = 10
retaliate = TRUE
hostile = FALSE
violent_breakthrough = TRUE
respect_alpha = FALSE
pointblank = TRUE
/datum/ai_holder/simple_mob/starhunter/aggro
hostile = TRUE
//basic aggro stahunters
/mob/living/simple_mob/humanoid/starhunter/hunter
ai_holder_type = /datum/ai_holder/simple_mob/starhunter/aggro
special_attack_cooldown = 30 SECONDS
special_attack_min_range = 1
special_attack_max_range = 7
/mob/living/simple_mob/humanoid/starhunter/hunter/harvester
icon_state = "snekdruid"
icon_state = "snekdruid"
melee_damage_lower = 25
melee_damage_upper = 25
melee_attack_delay = 2.5 SECOND
/mob/living/simple_mob/humanoid/starhunter/hunter/harvester/handle_special() //wierd movement
if(prob(20))
step(src, pick(cardinal))
..()
/mob/living/simple_mob/humanoid/starhunter/hunter/ninja
icon_state = "suneswift"
icon_living = "suneswift"
movement_cooldown = -3
melee_damage_lower = 15
melee_damage_upper = 15
melee_attack_delay = 1.5 SECOND
/mob/living/simple_mob/humanoid/starhunter/hunter/ninja/do_special_attack(atom/target)
if(prob(50))
teleportnompf(target)
else
smokebomb(target)
//Special attack procs
/mob/living/simple_mob/humanoid/starhunter/hunter/proc/teleportnompf(atom/target)
var/list/nearby_things = range(1, target)
var/list/valid_turfs = list()
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)
forceMove(target_turf)
var/mob/living/L = target
var/obj/belly/belly_dest
if(L.can_be_drop_prey && L.devourable)
L.forceMove(belly_dest)
to_chat(target, "<span class='danger'>[src] materializes around you, as you end up in their [belly_dest]!</span>")
/mob/living/simple_mob/humanoid/starhunter/hunter/proc/smokebomb(atom/target)
var/list/nearby_things = range(1, target)
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/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/smoke_spread
/mob/living/simple_mob/humanoid/starhunter
name = "Starhunter Initiate"
desc = "A strange critter cladded in strange armor."
icon = 'modular_chomp/icons/mob/starhunters.dmi'
icon_state = "sun"
icon_living = "sun"
icon_dead = "statisgem"
icon_gib = "syndicate_gib"
taser_kill = 0
faction = "starhunter"
movement_cooldown = 0
status_flags = 0
response_help = "pokes"
response_disarm = "shoves"
response_harm = "hits"
health = 120 //This may be high, but intend for the combative ones to be on their own.
maxHealth = 120
harm_intent_damage = 5
melee_damage_lower = 17 //machette
melee_damage_upper = 17 //beg knife go brrr
attack_sharp = 1
attack_edge = 1
attacktext = list("slashed", "stabbed")
projectile_dispersion = 8
projectile_accuracy = -20
armor = list(melee = 40, bullet = 70, laser = 10, energy = 0, bomb = 50, bio = 100, rad = 100) // Critters are more ortiented torwards melee and bullet
ranged_cooldown = 5
ai_holder_type = /datum/ai_holder/simple_mob/starhunter
can_be_drop_prey = FALSE
pass_flags = PASSTABLE
softfall = TRUE
//spaceproofing things
minbodytemp = 0 // Minimum "okay" temperature in kelvin
maxbodytemp = 600 // Maximum of above
min_oxy = 0 // Oxygen in moles, minimum, 0 is 'no minimum'
max_oxy = 0 // Oxygen in moles, maximum, 0 is 'no maximum'
min_tox = 0 // Phoron min
max_tox = 0 // Phoron max
min_co2 = 0 // CO2 min
max_co2 = 0 // CO2 max
min_n2 = 0 // N2 min
max_n2 = 0
/datum/ai_holder/simple_mob/starhunter
returns_home = TRUE // Stay close to the base...
wander = TRUE // ... but "patrol" a little.
intelligence_level = AI_SMART // Also knows not to walk while confused if it risks death.
can_flee = TRUE // If they're even allowed to flee.
flee_when_dying = TRUE // If they should flee when low on health.
dying_threshold = 0.2 // How low on health the holder needs to be before fleeing. Defaults to 30% or lower health.
mauling = TRUE
call_distance = 0 //Trying to disable this for the mobs
vision_range = 10
retaliate = TRUE
hostile = FALSE
violent_breakthrough = TRUE
respect_alpha = FALSE
pointblank = TRUE
/datum/ai_holder/simple_mob/starhunter/aggro
hostile = TRUE
//basic aggro stahunters
/mob/living/simple_mob/humanoid/starhunter/hunter
ai_holder_type = /datum/ai_holder/simple_mob/starhunter/aggro
special_attack_cooldown = 30 SECONDS
special_attack_min_range = 1
special_attack_max_range = 7
/mob/living/simple_mob/humanoid/starhunter/hunter/harvester
icon_state = "snekdruid"
icon_state = "snekdruid"
melee_damage_lower = 25
melee_damage_upper = 25
melee_attack_delay = 2.5 SECOND
/mob/living/simple_mob/humanoid/starhunter/hunter/harvester/handle_special() //wierd movement
if(prob(20))
step(src, pick(cardinal))
..()
/mob/living/simple_mob/humanoid/starhunter/hunter/ninja
icon_state = "suneswift"
icon_living = "suneswift"
movement_cooldown = -3
melee_damage_lower = 15
melee_damage_upper = 15
melee_attack_delay = 1.5 SECOND
/mob/living/simple_mob/humanoid/starhunter/hunter/ninja/do_special_attack(atom/target)
if(prob(50))
teleportnompf(target)
else
smokebomb(target)
//Special attack procs
/mob/living/simple_mob/humanoid/starhunter/hunter/proc/teleportnompf(atom/target)
var/list/nearby_things = range(1, target)
var/list/valid_turfs = list()
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)
forceMove(target_turf)
var/mob/living/L = target
var/obj/belly/belly_dest
if(L.can_be_drop_prey && L.devourable)
L.forceMove(belly_dest)
to_chat(target, "<span class='danger'>[src] materializes around you, as you end up in their [belly_dest]!</span>")
/mob/living/simple_mob/humanoid/starhunter/hunter/proc/smokebomb(atom/target)
var/list/nearby_things = range(1, target)
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/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/smoke_spread
s2.set_up(5, 1, target_turf)
@@ -1,115 +1,115 @@
/mob/living/simple_mob/humanoid/starhunter/hunter/druid
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.
can_be_drop_prey = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/starhunter/hunter/druid/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/humanoid/starhunter/hunter/druid/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/starhunter/hunter/druid/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.",
"Your surrondings glow with a neon red, dashes and spirals of pitch black flowing through the red gummy flesh as if it were a strange sky.",
"Your satsified predator sways their bloated gullet happily, their warm rumbling vibrarting the stomach, and by extension you.",)
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!",
"The caustic red acid splashes, and washes over your frame, your sense of smell being overwhelmed by acid and sulfur as you're turned to nutrion.",
"Every swift swap of the predator's hips sends you slamming against the glowing red sides, your vision blurring further as you contunie to weaken." ,)
/mob/living/simple_mob/humanoid/starhunter/hunter/champion
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.
can_be_drop_prey = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/starhunter/hunter/champion/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/humanoid/starhunter/hunter/champion/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/starhunter/hunter/champion/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.",
"Your surrondings glow with a neon red, dashes and spirals of pitch black flowing through the red gummy flesh as if it were a strange sky.",
"Your satsified predator sways their bloated gullet happily, their warm rumbling vibrarting the stomach, and by extension you.",)
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!",
"The caustic red acid splashes, and washes over your frame, your sense of smell being overwhelmed by acid and sulfur as you're turned to nutrion.",
"Every swift swap of the predator's hips sends you slamming against the glowing red sides, your vision blurring further as you contunie to weaken." ,)
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar
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 = SA_ICON_LIVING
can_be_drop_prey = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/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/humanoid/starhunter/hunter/avatar/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/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.",
"Your surrondings glow with a neon red, dashes and spirals of pitch black flowing through the red gummy flesh as if it were a strange sky.",
"Your satsified predator sways their bloated gullet happily, their warm rumbling vibrarting the stomach, and by extension you.",)
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!",
"The caustic red acid splashes, and washes over your frame, your sense of smell being overwhelmed by acid and sulfur as you're turned to nutrion.",
"Every swift swap of the predator's hips sends you slamming against the glowing red sides, your vision blurring further as you contunie to weaken." ,)
/mob/living/simple_mob/humanoid/starhunter/hunter/druid
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.
can_be_drop_prey = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/starhunter/hunter/druid/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/humanoid/starhunter/hunter/druid/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/starhunter/hunter/druid/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.",
"Your surrondings glow with a neon red, dashes and spirals of pitch black flowing through the red gummy flesh as if it were a strange sky.",
"Your satsified predator sways their bloated gullet happily, their warm rumbling vibrarting the stomach, and by extension you.",)
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!",
"The caustic red acid splashes, and washes over your frame, your sense of smell being overwhelmed by acid and sulfur as you're turned to nutrion.",
"Every swift swap of the predator's hips sends you slamming against the glowing red sides, your vision blurring further as you contunie to weaken." ,)
/mob/living/simple_mob/humanoid/starhunter/hunter/champion
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.
can_be_drop_prey = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/starhunter/hunter/champion/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/humanoid/starhunter/hunter/champion/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/starhunter/hunter/champion/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.",
"Your surrondings glow with a neon red, dashes and spirals of pitch black flowing through the red gummy flesh as if it were a strange sky.",
"Your satsified predator sways their bloated gullet happily, their warm rumbling vibrarting the stomach, and by extension you.",)
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!",
"The caustic red acid splashes, and washes over your frame, your sense of smell being overwhelmed by acid and sulfur as you're turned to nutrion.",
"Every swift swap of the predator's hips sends you slamming against the glowing red sides, your vision blurring further as you contunie to weaken." ,)
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar
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 = SA_ICON_LIVING
can_be_drop_prey = FALSE //CHOMP Add
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/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/humanoid/starhunter/hunter/avatar/MouseDrop_T(mob/living/M, mob/living/user)
return
/mob/living/simple_mob/humanoid/starhunter/hunter/avatar/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.",
"Your surrondings glow with a neon red, dashes and spirals of pitch black flowing through the red gummy flesh as if it were a strange sky.",
"Your satsified predator sways their bloated gullet happily, their warm rumbling vibrarting the stomach, and by extension you.",)
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!",
"The caustic red acid splashes, and washes over your frame, your sense of smell being overwhelmed by acid and sulfur as you're turned to nutrion.",
"Every swift swap of the predator's hips sends you slamming against the glowing red sides, your vision blurring further as you contunie to weaken." ,)
@@ -1,128 +1,128 @@
/mob/living/simple_mob/humanoid/starhunter/trader/weaponsmith
name = "Starhunter Weapon Smith"
icon_state = "sunetrader"
icon_living = "sunetrader"
products = list(/obj/item/weapon/gun/energy/sickshot = 5,
/obj/item/weapon/material/twohanded/fireaxe/scythe = 3,
/obj/item/weapon/material/twohanded/spear/lance = 3,
/obj/item/weapon/beartrap = 12,
/obj/item/weapon/material/barbedwire = 12,
/obj/item/weapon/material/sword/battleaxe = 3
) // For each, use the following pattern:
premium = list(/obj/item/weapon/gun/energy/maghowitzer) //This may be a mistake
prices = list(/obj/item/weapon/gun/energy/maghowitzer = 8000,
/obj/item/weapon/gun/energy/sickshot = 800,
/obj/item/weapon/material/twohanded/fireaxe/scythe = 400,
/obj/item/weapon/material/twohanded/spear/lance = 400,
/obj/item/weapon/beartrap = 80,
/obj/item/weapon/material/barbedwire = 80,
/obj/item/weapon/material/sword/battleaxe = 400
)
/mob/living/simple_mob/humanoid/starhunter/trader/reliccollecter
name = "Starhunter Relic Collector"
icon_state = "snektrader"
icon_living = "snektrader"
products = list(/obj/item/clothing/head/helmet/combat/crusader = 3,
/obj/item/clothing/suit/armor/combat/crusader = 3,
/obj/item/clothing/head/culthood = 3,
/obj/item/clothing/suit/cultrobes = 3,
/obj/item/clothing/head/helmet/space/cult = 3,
/obj/item/clothing/suit/space/cult = 3,
/obj/item/device/soulstone = 8,
/obj/item/clothing/glasses/monocoole = 3,
/obj/item/weapon/storage/belt/holding = 1,
/obj/item/clothing/gloves/regen = 1
) // For each, use the following pattern:
premium = list(/obj/item/clothing/glasses/omni) //I am unsure why but this feels right
prices = list(/obj/item/clothing/head/helmet/combat/crusader = 600,
/obj/item/clothing/suit/armor/combat/crusader = 600,
/obj/item/clothing/head/culthood = 600,
/obj/item/clothing/suit/cultrobes = 600,
/obj/item/clothing/head/helmet/space/cult = 600,
/obj/item/clothing/suit/space/cult = 600,
/obj/item/device/soulstone = 80,
/obj/item/clothing/glasses/monocoole = 1200,
/obj/item/weapon/storage/belt/holding = 1800,
/obj/item/clothing/gloves/regen = 1800,
/obj/item/clothing/glasses/omni = 2600
)
/mob/living/simple_mob/humanoid/starhunter/trader/miner
name = "Starhunter Miner"
icon_state = "snektrader"
icon_living = "snektrader"
products = list(/obj/item/weapon/kinetic_crusher/glaive = 5,
/obj/item/weapon/kinetic_crusher = 3,
/obj/item/weapon/gun/energy/mininglaser = 3,
/obj/item/weapon/melee/shock_maul = 3,
/obj/item/stack/material/phoron = 50,
/obj/item/stack/material/uranium = 50,
/obj/item/stack/material/tritium = 50,
/obj/item/stack/material/deuterium = 50,
/obj/item/stack/material/bronze = 50,
/obj/item/weapon/circuitboard/paradoxrift = 3
) // For each, use the following pattern:
premium = list(/obj/item/weapon/circuitboard/defenseonelisk) // No specified amount = only one in stock
prices = list(/obj/item/weapon/kinetic_crusher/glaive = 600,
/obj/item/weapon/kinetic_crusher = 600,
/obj/item/weapon/gun/energy/mininglaser = 800,
/obj/item/weapon/melee/shock_maul = 600,
/obj/item/stack/material/phoron = 12,
/obj/item/stack/material/uranium = 12,
/obj/item/stack/material/tritium = 12,
/obj/item/stack/material/deuterium = 12,
/obj/item/stack/material/bronze = 12,
/obj/item/weapon/circuitboard/paradoxrift = 2400,
/obj/item/weapon/circuitboard/defenseonelisk = 5000
)
/mob/living/simple_mob/humanoid/starhunter/trader/farmer
name = "Starhunter Farmer"
icon_state = "sunetrader"
icon_living = "sunetrader"
products = list(/obj/item/slime_extract/sepia =3,
/obj/item/slime_extract/ruby = 3,
/obj/item/slime_extract/bluespace = 3,
/obj/item/slime_extract/oil = 3,
/obj/item/slime_extract/sapphire = 3,
/obj/item/slime_extract/emerald = 3,
/obj/item/seeds/shrinkshroom = 12,
/obj/item/seeds/megashroom = 12,
/obj/item/seeds/pitcherseed = 6,
/obj/item/seeds/deathberryseed = 6,
/obj/item/seeds/ambrosiainfernusseed = 6,
/obj/item/seeds/thaadra = 6,
/obj/item/seeds/icepepperseed = 6,
/obj/item/seeds/jurlmah = 6,
/obj/item/seeds/amauri = 6,
/obj/item/seeds/gelthi = 6,
/obj/item/seeds/vale = 6
) // For each, use the following pattern:
premium = list() // No specified amount = only one in stock
prices = list(/obj/item/slime_extract/sepia = 2500,
/obj/item/slime_extract/ruby = 2250,
/obj/item/slime_extract/bluespace = 2250,
/obj/item/slime_extract/oil = 2250,
/obj/item/slime_extract/sapphire = 2250,
/obj/item/slime_extract/emerald = 2250,
/obj/item/seeds/shrinkshroom = 50,
/obj/item/seeds/megashroom = 50,
/obj/item/seeds/pitcherseed = 125,
/obj/item/seeds/deathberryseed = 125,
/obj/item/seeds/ambrosiainfernusseed = 125,
/obj/item/seeds/thaadra = 125,
/obj/item/seeds/icepepperseed = 125,
/obj/item/seeds/jurlmah = 125,
/obj/item/seeds/amauri = 125,
/obj/item/seeds/gelthi = 125,
/mob/living/simple_mob/humanoid/starhunter/trader/weaponsmith
name = "Starhunter Weapon Smith"
icon_state = "sunetrader"
icon_living = "sunetrader"
products = list(/obj/item/weapon/gun/energy/sickshot = 5,
/obj/item/weapon/material/twohanded/fireaxe/scythe = 3,
/obj/item/weapon/material/twohanded/spear/lance = 3,
/obj/item/weapon/beartrap = 12,
/obj/item/weapon/material/barbedwire = 12,
/obj/item/weapon/material/sword/battleaxe = 3
) // For each, use the following pattern:
premium = list(/obj/item/weapon/gun/energy/maghowitzer) //This may be a mistake
prices = list(/obj/item/weapon/gun/energy/maghowitzer = 8000,
/obj/item/weapon/gun/energy/sickshot = 800,
/obj/item/weapon/material/twohanded/fireaxe/scythe = 400,
/obj/item/weapon/material/twohanded/spear/lance = 400,
/obj/item/weapon/beartrap = 80,
/obj/item/weapon/material/barbedwire = 80,
/obj/item/weapon/material/sword/battleaxe = 400
)
/mob/living/simple_mob/humanoid/starhunter/trader/reliccollecter
name = "Starhunter Relic Collector"
icon_state = "snektrader"
icon_living = "snektrader"
products = list(/obj/item/clothing/head/helmet/combat/crusader = 3,
/obj/item/clothing/suit/armor/combat/crusader = 3,
/obj/item/clothing/head/culthood = 3,
/obj/item/clothing/suit/cultrobes = 3,
/obj/item/clothing/head/helmet/space/cult = 3,
/obj/item/clothing/suit/space/cult = 3,
/obj/item/device/soulstone = 8,
/obj/item/clothing/glasses/monocoole = 3,
/obj/item/weapon/storage/belt/holding = 1,
/obj/item/clothing/gloves/regen = 1
) // For each, use the following pattern:
premium = list(/obj/item/clothing/glasses/omni) //I am unsure why but this feels right
prices = list(/obj/item/clothing/head/helmet/combat/crusader = 600,
/obj/item/clothing/suit/armor/combat/crusader = 600,
/obj/item/clothing/head/culthood = 600,
/obj/item/clothing/suit/cultrobes = 600,
/obj/item/clothing/head/helmet/space/cult = 600,
/obj/item/clothing/suit/space/cult = 600,
/obj/item/device/soulstone = 80,
/obj/item/clothing/glasses/monocoole = 1200,
/obj/item/weapon/storage/belt/holding = 1800,
/obj/item/clothing/gloves/regen = 1800,
/obj/item/clothing/glasses/omni = 2600
)
/mob/living/simple_mob/humanoid/starhunter/trader/miner
name = "Starhunter Miner"
icon_state = "snektrader"
icon_living = "snektrader"
products = list(/obj/item/weapon/kinetic_crusher/glaive = 5,
/obj/item/weapon/kinetic_crusher = 3,
/obj/item/weapon/gun/energy/mininglaser = 3,
/obj/item/weapon/melee/shock_maul = 3,
/obj/item/stack/material/phoron = 50,
/obj/item/stack/material/uranium = 50,
/obj/item/stack/material/tritium = 50,
/obj/item/stack/material/deuterium = 50,
/obj/item/stack/material/bronze = 50,
/obj/item/weapon/circuitboard/paradoxrift = 3
) // For each, use the following pattern:
premium = list(/obj/item/weapon/circuitboard/defenseonelisk) // No specified amount = only one in stock
prices = list(/obj/item/weapon/kinetic_crusher/glaive = 600,
/obj/item/weapon/kinetic_crusher = 600,
/obj/item/weapon/gun/energy/mininglaser = 800,
/obj/item/weapon/melee/shock_maul = 600,
/obj/item/stack/material/phoron = 12,
/obj/item/stack/material/uranium = 12,
/obj/item/stack/material/tritium = 12,
/obj/item/stack/material/deuterium = 12,
/obj/item/stack/material/bronze = 12,
/obj/item/weapon/circuitboard/paradoxrift = 2400,
/obj/item/weapon/circuitboard/defenseonelisk = 5000
)
/mob/living/simple_mob/humanoid/starhunter/trader/farmer
name = "Starhunter Farmer"
icon_state = "sunetrader"
icon_living = "sunetrader"
products = list(/obj/item/slime_extract/sepia =3,
/obj/item/slime_extract/ruby = 3,
/obj/item/slime_extract/bluespace = 3,
/obj/item/slime_extract/oil = 3,
/obj/item/slime_extract/sapphire = 3,
/obj/item/slime_extract/emerald = 3,
/obj/item/seeds/shrinkshroom = 12,
/obj/item/seeds/megashroom = 12,
/obj/item/seeds/pitcherseed = 6,
/obj/item/seeds/deathberryseed = 6,
/obj/item/seeds/ambrosiainfernusseed = 6,
/obj/item/seeds/thaadra = 6,
/obj/item/seeds/icepepperseed = 6,
/obj/item/seeds/jurlmah = 6,
/obj/item/seeds/amauri = 6,
/obj/item/seeds/gelthi = 6,
/obj/item/seeds/vale = 6
) // For each, use the following pattern:
premium = list() // No specified amount = only one in stock
prices = list(/obj/item/slime_extract/sepia = 2500,
/obj/item/slime_extract/ruby = 2250,
/obj/item/slime_extract/bluespace = 2250,
/obj/item/slime_extract/oil = 2250,
/obj/item/slime_extract/sapphire = 2250,
/obj/item/slime_extract/emerald = 2250,
/obj/item/seeds/shrinkshroom = 50,
/obj/item/seeds/megashroom = 50,
/obj/item/seeds/pitcherseed = 125,
/obj/item/seeds/deathberryseed = 125,
/obj/item/seeds/ambrosiainfernusseed = 125,
/obj/item/seeds/thaadra = 125,
/obj/item/seeds/icepepperseed = 125,
/obj/item/seeds/jurlmah = 125,
/obj/item/seeds/amauri = 125,
/obj/item/seeds/gelthi = 125,
/obj/item/seeds/vale = 125)
@@ -1,392 +1,392 @@
/mob/living/simple_mob/humanoid/starhunter/trader
var/vend_ready = 1 //Are we ready to vend?? Is it time??
var/vend_delay = 10 //How long does it take to vend?
var/categories = CAT_NORMAL // Bitmask of cats we're currently showing
var/datum/stored_item/vending_product/currently_vending = null // What we're requesting payment for right now
var/vending_sound = "machines/vending/vending_drop.ogg"
/*
Variables used to initialize the product list
These are used for initialization only, and so are optional if
product_records is specified
*/
var/list/products = list() // For each, use the following pattern:
var/list/contraband = list() // list(/type/path = amount,/type/path2 = amount2)
var/list/premium = list() // No specified amount = only one in stock
/// Set automatically, allows coin use
var/has_premium = FALSE
var/list/prices = list() // Prices for each item, list(/type/path = price), items not in the list don't have a price.
/// Set automatically, enables pricing
var/has_prices = FALSE
// This one is used for refill cartridge use.
var/list/refill = list() // For each, use the following pattern:
// Enables refilling with appropriate cartridges
var/refillable = TRUE
var/obj/item/weapon/coin/coin
var/list/log = list()
var/has_logs = 0
var/list/product_records = list()
/mob/living/simple_mob/humanoid/starhunter/trader/Initialize()
. = ..()
build_inventory()
/mob/living/simple_mob/humanoid/starhunter/trader/proc/build_inventory()
var/list/all_products = list(
list(products, CAT_NORMAL),
list(contraband, CAT_HIDDEN),
list(premium, CAT_COIN))
for(var/current_list in all_products)
var/category = current_list[2]
for(var/entry in current_list[1])
var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry)
product.price = (entry in prices) ? prices[entry] : 0
product.amount = (current_list[1][entry]) ? current_list[1][entry] : 1
product.category = category
GLOB.vending_products[entry] = 1
if(LAZYLEN(prices))
has_prices = TRUE
if(LAZYLEN(premium))
has_premium = TRUE
LAZYCLEARLIST(products)
LAZYCLEARLIST(contraband)
LAZYCLEARLIST(premium)
LAZYCLEARLIST(prices)
all_products.Cut()
/mob/living/simple_mob/humanoid/starhunter/trader/attackby(obj/item/weapon/W as obj, mob/user as mob)
var/obj/item/weapon/card/id/I = W.GetID()
if(I || istype(W, /obj/item/weapon/spacecash))
attack_hand(user)
return
else if(istype(W, /obj/item/weapon/coin) && has_premium)
user.drop_item()
W.forceMove(src)
coin = W
categories |= CAT_COIN
to_chat(user, "<span class='notice'>You insert \the [W] into \the [src].</span>")
SStgui.update_uis(src)
return
else
for(var/datum/stored_item/vending_product/R in product_records)
if(istype(W, R.item_path) && (W.name == R.item_name))
stock(W, R, user)
return
..()
/mob/living/simple_mob/humanoid/starhunter/trader/proc/pay_with_cash(var/obj/item/weapon/spacecash/cashmoney, mob/user)
if(currently_vending.price > cashmoney.worth)
// This is not a status display message, since it's something the character
// themselves is meant to see BEFORE putting the money in
to_chat(usr, "\icon[cashmoney][bicon(cashmoney)] <span class='warning'>That is not enough money.</span>")
return 0
if(istype(cashmoney, /obj/item/weapon/spacecash))
visible_message("<span class='info'>\The [usr] inserts some cash into \the [src].</span>")
cashmoney.worth -= currently_vending.price
if(cashmoney.worth <= 0)
usr.drop_from_inventory(cashmoney)
qdel(cashmoney)
else
cashmoney.update_icon()
// Vending machines have no idea who paid with cash
credit_purchase("(cash)")
return 1
/mob/living/simple_mob/humanoid/starhunter/trader/proc/credit_purchase(var/target as text)
vendor_account.money += currently_vending.price
var/datum/transaction/T = new()
T.target_name = target
T.purpose = "Purchase of [currently_vending.item_name]"
T.amount = "[currently_vending.price]"
T.source_terminal = name
T.date = current_date_string
T.time = stationtime2text()
vendor_account.transaction_log.Add(T)
/mob/living/simple_mob/humanoid/starhunter/trader/tgui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Vending", name)
ui.open()
/mob/living/simple_mob/humanoid/starhunter/trader/tgui_data(mob/user)
var/list/data = list()
var/list/listed_products = list()
data["chargesMoney"] = has_prices ? TRUE : FALSE
data["products"] = listed_products
if(coin)
data["coin"] = coin.name
else
data["coin"] = FALSE
if(currently_vending)
data["actively_vending"] = currently_vending.item_name
else
data["actively_vending"] = null
var/mob/living/carbon/human/H
var/obj/item/weapon/card/id/C
data["guestNotice"] = "Please present cash.";
data["userMoney"] = 0
data["user"] = null
if(ishuman(user))
H = user
C = H.GetIdCard()
var/obj/item/weapon/spacecash/S = H.get_active_hand()
if(istype(S))
data["userMoney"] = S.worth
data["guestNotice"] = "Accepting [S.initial_name]. You have: [S.worth]₮."
else if(istype(C))
var/datum/money_account/A = get_account(C.associated_account_number)
if(istype(A))
data["user"] = list()
data["user"]["name"] = A.owner_name
data["userMoney"] = A.money
data["user"]["job"] = (istype(C) && C.rank) ? C.rank : "No Job"
else
data["guestNotice"] = "Unlinked ID detected. Present cash to pay.";
return data
/mob/living/simple_mob/humanoid/starhunter/trader/tgui_act(action, params)
if(usr.stat || usr.restrained())
return
if(..())
return TRUE
. = TRUE
switch(action)
if("remove_coin")
if(issilicon(usr))
return FALSE
if(!coin)
to_chat(usr, "<span class='filter_notice'>There is no coin in this machine.</span>")
return
coin.forceMove(src.loc)
if(!usr.get_active_hand())
usr.put_in_hands(coin)
to_chat(usr, "<span class='notice'>You remove \the [coin] from \the [src].</span>")
coin = null
categories &= ~CAT_COIN
return TRUE
if("vend")
if(!vend_ready)
to_chat(usr, "<span class='warning'>[src] is busy!</span>")
return
var/key = text2num(params["vend"])
var/datum/stored_item/vending_product/R = product_records[key]
// This should not happen unless the request from NanoUI was bad
if(!(R.category & categories))
return
if(!can_buy(R, usr))
return
if(R.price <= 0)
vend(R, usr)
add_fingerprint(usr)
return TRUE
if(issilicon(usr)) //If the item is not free, provide feedback if a synth is trying to buy something.
to_chat(usr, "<span class='danger'>Lawed unit recognized. Lawed units cannot complete this transaction. Purchase canceled.</span>")
return
if(!ishuman(usr))
return
vend_ready = FALSE // From this point onwards, vendor is locked to performing this transaction only, until it is resolved.
var/mob/living/carbon/human/H = usr
var/obj/item/weapon/card/id/C = H.GetIdCard()
if(!vendor_account || vendor_account.suspended)
to_chat(usr, "<span class='filter_notice'>Vendor account offline. Unable to process transaction.</span>")
flick("[icon_state]-deny",src)
vend_ready = TRUE
return
currently_vending = R
var/paid = FALSE
if(istype(usr.get_active_hand(), /obj/item/weapon/spacecash))
var/obj/item/weapon/spacecash/cash = usr.get_active_hand()
paid = pay_with_cash(cash, usr)
else if(istype(usr.get_active_hand(), /obj/item/weapon/spacecash/ewallet))
var/obj/item/weapon/spacecash/ewallet/wallet = usr.get_active_hand()
paid = pay_with_ewallet(wallet)
else if(istype(C, /obj/item/weapon/card))
paid = pay_with_card(C, usr)
/*else if(usr.can_advanced_admin_interact())
to_chat(usr, "<span class='notice'>Vending object due to admin interaction.</span>")
paid = TRUE*/
else
to_chat(usr, "<span class='warning'>Payment failure: you have no ID or other method of payment.</span>")
vend_ready = TRUE
flick("[icon_state]-deny",src)
return TRUE // we set this because they shouldn't even be able to get this far, and we want the UI to update.
if(paid)
vend(currently_vending, usr) // vend will handle vend_ready
. = TRUE
else
to_chat(usr, "<span class='warning'>Payment failure: unable to process payment.</span>")
vend_ready = TRUE
/mob/living/simple_mob/humanoid/starhunter/trader/proc/vend(datum/stored_item/vending_product/R, mob/user)
if(!can_buy(R, user))
return
if(!R.amount)
to_chat(user, "<span class='warning'>[src] has ran out of that product.</span>")
vend_ready = TRUE
return
vend_ready = FALSE //One thing at a time!!
SStgui.update_uis(src)
if(R.category & CAT_COIN)
if(!coin)
to_chat(user, "<span class='notice'>You need to insert a coin to get this item.</span>")
return
else
qdel(coin)
coin = null
categories &= ~CAT_COIN
flick("[icon_state]-vend",src)
addtimer(CALLBACK(src, PROC_REF(delayed_vend), R, user), vend_delay)
/mob/living/simple_mob/humanoid/starhunter/trader/proc/delayed_vend(datum/stored_item/vending_product/R, mob/user)
R.get_product(get_turf(src))
playsound(src, "sound/[vending_sound]", 100, 1, 1)
GLOB.items_sold_shift_roundstat++
vend_ready = 1
currently_vending = null
SStgui.update_uis(src)
/mob/living/simple_mob/humanoid/starhunter/trader/proc/stock(obj/item/weapon/W, var/datum/stored_item/vending_product/R, var/mob/user)
if(!user.unEquip(W))
return
to_chat(user, "<span class='notice'>You insert \the [W] in the product receptor.</span>")
R.add_product(W)
if(has_logs)
do_logging(R, user)
SStgui.update_uis(src)
/mob/living/simple_mob/humanoid/starhunter/trader/proc/pay_with_ewallet(var/obj/item/weapon/spacecash/ewallet/wallet)
visible_message("<span class='info'>\The [usr] swipes \the [wallet] through \the [src].</span>")
playsound(src, 'sound/machines/id_swipe.ogg', 50, 1)
if(currently_vending.price > wallet.worth)
to_chat(usr, "<span class='warning'>Insufficient funds on chargecard.</span>")
return 0
else
wallet.worth -= currently_vending.price
credit_purchase("[wallet.owner_name] (chargecard)")
return 1
/**
* Scan a card and attempt to transfer payment from associated account.
*
* Takes payment for whatever is the currently_vending item. Returns 1 if
* successful, 0 if failed
*/
/mob/living/simple_mob/humanoid/starhunter/trader/proc/pay_with_card(obj/item/weapon/card/id/I, mob/M)
visible_message("<span class='info'>[M] swipes a card through [src].</span>")
playsound(src, 'sound/machines/id_swipe.ogg', 50, 1)
var/datum/money_account/customer_account = get_account(I.associated_account_number)
if(!customer_account)
to_chat(M, "<span class='warning'>Error: Unable to access account. Please contact technical support if problem persists.</span>")
return FALSE
if(customer_account.suspended)
to_chat(M, "<span class='warning'>Unable to access account: account suspended.</span>")
return FALSE
// Have the customer punch in the PIN before checking if there's enough money. Prevents people from figuring out acct is
// empty at high security levels
if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
var/attempt_pin = tgui_input_number(usr, "Enter pin code", "Vendor transaction")
customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2)
if(!customer_account)
to_chat(M, "<span class='warning'>Unable to access account: incorrect credentials.</span>")
return FALSE
if(currently_vending.price > customer_account.money)
to_chat(M, "<span class='warning'>Insufficient funds in account.</span>")
return FALSE
// Okay to move the money at this point
// debit money from the purchaser's account
customer_account.money -= currently_vending.price
// create entry in the purchaser's account log
var/datum/transaction/T = new()
T.target_name = "[vendor_account.owner_name] (via [name])"
T.purpose = "Purchase of [currently_vending.item_name]"
if(currently_vending.price > 0)
T.amount = "([currently_vending.price])"
else
T.amount = "[currently_vending.price]"
T.source_terminal = name
T.date = current_date_string
T.time = stationtime2text()
customer_account.transaction_log.Add(T)
// Give the vendor the money. We use the account owner name, which means
// that purchases made with stolen/borrowed card will look like the card
// owner made them
credit_purchase(customer_account.owner_name)
return 1
/mob/living/simple_mob/humanoid/starhunter/trader/proc/do_logging(datum/stored_item/vending_product/R, mob/user, var/vending = 0)
if(user.GetIdCard())
var/obj/item/weapon/card/id/tempid = user.GetIdCard()
var/list/list_item = list()
if(vending)
list_item += "vend"
else
list_item += "stock"
list_item += tempid.registered_name
list_item += stationtime2text()
list_item += R.item_name
log[++log.len] = list_item
/mob/living/simple_mob/humanoid/starhunter/trader/proc/can_buy(datum/stored_item/vending_product/R, mob/user)
return TRUE
/mob/living/simple_mob/humanoid/starhunter/trader
var/vend_ready = 1 //Are we ready to vend?? Is it time??
var/vend_delay = 10 //How long does it take to vend?
var/categories = CAT_NORMAL // Bitmask of cats we're currently showing
var/datum/stored_item/vending_product/currently_vending = null // What we're requesting payment for right now
var/vending_sound = "machines/vending/vending_drop.ogg"
/*
Variables used to initialize the product list
These are used for initialization only, and so are optional if
product_records is specified
*/
var/list/products = list() // For each, use the following pattern:
var/list/contraband = list() // list(/type/path = amount,/type/path2 = amount2)
var/list/premium = list() // No specified amount = only one in stock
/// Set automatically, allows coin use
var/has_premium = FALSE
var/list/prices = list() // Prices for each item, list(/type/path = price), items not in the list don't have a price.
/// Set automatically, enables pricing
var/has_prices = FALSE
// This one is used for refill cartridge use.
var/list/refill = list() // For each, use the following pattern:
// Enables refilling with appropriate cartridges
var/refillable = TRUE
var/obj/item/weapon/coin/coin
var/list/log = list()
var/has_logs = 0
var/list/product_records = list()
/mob/living/simple_mob/humanoid/starhunter/trader/Initialize()
. = ..()
build_inventory()
/mob/living/simple_mob/humanoid/starhunter/trader/proc/build_inventory()
var/list/all_products = list(
list(products, CAT_NORMAL),
list(contraband, CAT_HIDDEN),
list(premium, CAT_COIN))
for(var/current_list in all_products)
var/category = current_list[2]
for(var/entry in current_list[1])
var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry)
product.price = (entry in prices) ? prices[entry] : 0
product.amount = (current_list[1][entry]) ? current_list[1][entry] : 1
product.category = category
GLOB.vending_products[entry] = 1
if(LAZYLEN(prices))
has_prices = TRUE
if(LAZYLEN(premium))
has_premium = TRUE
LAZYCLEARLIST(products)
LAZYCLEARLIST(contraband)
LAZYCLEARLIST(premium)
LAZYCLEARLIST(prices)
all_products.Cut()
/mob/living/simple_mob/humanoid/starhunter/trader/attackby(obj/item/weapon/W as obj, mob/user as mob)
var/obj/item/weapon/card/id/I = W.GetID()
if(I || istype(W, /obj/item/weapon/spacecash))
attack_hand(user)
return
else if(istype(W, /obj/item/weapon/coin) && has_premium)
user.drop_item()
W.forceMove(src)
coin = W
categories |= CAT_COIN
to_chat(user, "<span class='notice'>You insert \the [W] into \the [src].</span>")
SStgui.update_uis(src)
return
else
for(var/datum/stored_item/vending_product/R in product_records)
if(istype(W, R.item_path) && (W.name == R.item_name))
stock(W, R, user)
return
..()
/mob/living/simple_mob/humanoid/starhunter/trader/proc/pay_with_cash(var/obj/item/weapon/spacecash/cashmoney, mob/user)
if(currently_vending.price > cashmoney.worth)
// This is not a status display message, since it's something the character
// themselves is meant to see BEFORE putting the money in
to_chat(usr, "\icon[cashmoney][bicon(cashmoney)] <span class='warning'>That is not enough money.</span>")
return 0
if(istype(cashmoney, /obj/item/weapon/spacecash))
visible_message("<span class='info'>\The [usr] inserts some cash into \the [src].</span>")
cashmoney.worth -= currently_vending.price
if(cashmoney.worth <= 0)
usr.drop_from_inventory(cashmoney)
qdel(cashmoney)
else
cashmoney.update_icon()
// Vending machines have no idea who paid with cash
credit_purchase("(cash)")
return 1
/mob/living/simple_mob/humanoid/starhunter/trader/proc/credit_purchase(var/target as text)
vendor_account.money += currently_vending.price
var/datum/transaction/T = new()
T.target_name = target
T.purpose = "Purchase of [currently_vending.item_name]"
T.amount = "[currently_vending.price]"
T.source_terminal = name
T.date = current_date_string
T.time = stationtime2text()
vendor_account.transaction_log.Add(T)
/mob/living/simple_mob/humanoid/starhunter/trader/tgui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Vending", name)
ui.open()
/mob/living/simple_mob/humanoid/starhunter/trader/tgui_data(mob/user)
var/list/data = list()
var/list/listed_products = list()
data["chargesMoney"] = has_prices ? TRUE : FALSE
data["products"] = listed_products
if(coin)
data["coin"] = coin.name
else
data["coin"] = FALSE
if(currently_vending)
data["actively_vending"] = currently_vending.item_name
else
data["actively_vending"] = null
var/mob/living/carbon/human/H
var/obj/item/weapon/card/id/C
data["guestNotice"] = "Please present cash.";
data["userMoney"] = 0
data["user"] = null
if(ishuman(user))
H = user
C = H.GetIdCard()
var/obj/item/weapon/spacecash/S = H.get_active_hand()
if(istype(S))
data["userMoney"] = S.worth
data["guestNotice"] = "Accepting [S.initial_name]. You have: [S.worth]₮."
else if(istype(C))
var/datum/money_account/A = get_account(C.associated_account_number)
if(istype(A))
data["user"] = list()
data["user"]["name"] = A.owner_name
data["userMoney"] = A.money
data["user"]["job"] = (istype(C) && C.rank) ? C.rank : "No Job"
else
data["guestNotice"] = "Unlinked ID detected. Present cash to pay.";
return data
/mob/living/simple_mob/humanoid/starhunter/trader/tgui_act(action, params)
if(usr.stat || usr.restrained())
return
if(..())
return TRUE
. = TRUE
switch(action)
if("remove_coin")
if(issilicon(usr))
return FALSE
if(!coin)
to_chat(usr, "<span class='filter_notice'>There is no coin in this machine.</span>")
return
coin.forceMove(src.loc)
if(!usr.get_active_hand())
usr.put_in_hands(coin)
to_chat(usr, "<span class='notice'>You remove \the [coin] from \the [src].</span>")
coin = null
categories &= ~CAT_COIN
return TRUE
if("vend")
if(!vend_ready)
to_chat(usr, "<span class='warning'>[src] is busy!</span>")
return
var/key = text2num(params["vend"])
var/datum/stored_item/vending_product/R = product_records[key]
// This should not happen unless the request from NanoUI was bad
if(!(R.category & categories))
return
if(!can_buy(R, usr))
return
if(R.price <= 0)
vend(R, usr)
add_fingerprint(usr)
return TRUE
if(issilicon(usr)) //If the item is not free, provide feedback if a synth is trying to buy something.
to_chat(usr, "<span class='danger'>Lawed unit recognized. Lawed units cannot complete this transaction. Purchase canceled.</span>")
return
if(!ishuman(usr))
return
vend_ready = FALSE // From this point onwards, vendor is locked to performing this transaction only, until it is resolved.
var/mob/living/carbon/human/H = usr
var/obj/item/weapon/card/id/C = H.GetIdCard()
if(!vendor_account || vendor_account.suspended)
to_chat(usr, "<span class='filter_notice'>Vendor account offline. Unable to process transaction.</span>")
flick("[icon_state]-deny",src)
vend_ready = TRUE
return
currently_vending = R
var/paid = FALSE
if(istype(usr.get_active_hand(), /obj/item/weapon/spacecash))
var/obj/item/weapon/spacecash/cash = usr.get_active_hand()
paid = pay_with_cash(cash, usr)
else if(istype(usr.get_active_hand(), /obj/item/weapon/spacecash/ewallet))
var/obj/item/weapon/spacecash/ewallet/wallet = usr.get_active_hand()
paid = pay_with_ewallet(wallet)
else if(istype(C, /obj/item/weapon/card))
paid = pay_with_card(C, usr)
/*else if(usr.can_advanced_admin_interact())
to_chat(usr, "<span class='notice'>Vending object due to admin interaction.</span>")
paid = TRUE*/
else
to_chat(usr, "<span class='warning'>Payment failure: you have no ID or other method of payment.</span>")
vend_ready = TRUE
flick("[icon_state]-deny",src)
return TRUE // we set this because they shouldn't even be able to get this far, and we want the UI to update.
if(paid)
vend(currently_vending, usr) // vend will handle vend_ready
. = TRUE
else
to_chat(usr, "<span class='warning'>Payment failure: unable to process payment.</span>")
vend_ready = TRUE
/mob/living/simple_mob/humanoid/starhunter/trader/proc/vend(datum/stored_item/vending_product/R, mob/user)
if(!can_buy(R, user))
return
if(!R.amount)
to_chat(user, "<span class='warning'>[src] has ran out of that product.</span>")
vend_ready = TRUE
return
vend_ready = FALSE //One thing at a time!!
SStgui.update_uis(src)
if(R.category & CAT_COIN)
if(!coin)
to_chat(user, "<span class='notice'>You need to insert a coin to get this item.</span>")
return
else
qdel(coin)
coin = null
categories &= ~CAT_COIN
flick("[icon_state]-vend",src)
addtimer(CALLBACK(src, PROC_REF(delayed_vend), R, user), vend_delay)
/mob/living/simple_mob/humanoid/starhunter/trader/proc/delayed_vend(datum/stored_item/vending_product/R, mob/user)
R.get_product(get_turf(src))
playsound(src, "sound/[vending_sound]", 100, 1, 1)
GLOB.items_sold_shift_roundstat++
vend_ready = 1
currently_vending = null
SStgui.update_uis(src)
/mob/living/simple_mob/humanoid/starhunter/trader/proc/stock(obj/item/weapon/W, var/datum/stored_item/vending_product/R, var/mob/user)
if(!user.unEquip(W))
return
to_chat(user, "<span class='notice'>You insert \the [W] in the product receptor.</span>")
R.add_product(W)
if(has_logs)
do_logging(R, user)
SStgui.update_uis(src)
/mob/living/simple_mob/humanoid/starhunter/trader/proc/pay_with_ewallet(var/obj/item/weapon/spacecash/ewallet/wallet)
visible_message("<span class='info'>\The [usr] swipes \the [wallet] through \the [src].</span>")
playsound(src, 'sound/machines/id_swipe.ogg', 50, 1)
if(currently_vending.price > wallet.worth)
to_chat(usr, "<span class='warning'>Insufficient funds on chargecard.</span>")
return 0
else
wallet.worth -= currently_vending.price
credit_purchase("[wallet.owner_name] (chargecard)")
return 1
/**
* Scan a card and attempt to transfer payment from associated account.
*
* Takes payment for whatever is the currently_vending item. Returns 1 if
* successful, 0 if failed
*/
/mob/living/simple_mob/humanoid/starhunter/trader/proc/pay_with_card(obj/item/weapon/card/id/I, mob/M)
visible_message("<span class='info'>[M] swipes a card through [src].</span>")
playsound(src, 'sound/machines/id_swipe.ogg', 50, 1)
var/datum/money_account/customer_account = get_account(I.associated_account_number)
if(!customer_account)
to_chat(M, "<span class='warning'>Error: Unable to access account. Please contact technical support if problem persists.</span>")
return FALSE
if(customer_account.suspended)
to_chat(M, "<span class='warning'>Unable to access account: account suspended.</span>")
return FALSE
// Have the customer punch in the PIN before checking if there's enough money. Prevents people from figuring out acct is
// empty at high security levels
if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
var/attempt_pin = tgui_input_number(usr, "Enter pin code", "Vendor transaction")
customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2)
if(!customer_account)
to_chat(M, "<span class='warning'>Unable to access account: incorrect credentials.</span>")
return FALSE
if(currently_vending.price > customer_account.money)
to_chat(M, "<span class='warning'>Insufficient funds in account.</span>")
return FALSE
// Okay to move the money at this point
// debit money from the purchaser's account
customer_account.money -= currently_vending.price
// create entry in the purchaser's account log
var/datum/transaction/T = new()
T.target_name = "[vendor_account.owner_name] (via [name])"
T.purpose = "Purchase of [currently_vending.item_name]"
if(currently_vending.price > 0)
T.amount = "([currently_vending.price])"
else
T.amount = "[currently_vending.price]"
T.source_terminal = name
T.date = current_date_string
T.time = stationtime2text()
customer_account.transaction_log.Add(T)
// Give the vendor the money. We use the account owner name, which means
// that purchases made with stolen/borrowed card will look like the card
// owner made them
credit_purchase(customer_account.owner_name)
return 1
/mob/living/simple_mob/humanoid/starhunter/trader/proc/do_logging(datum/stored_item/vending_product/R, mob/user, var/vending = 0)
if(user.GetIdCard())
var/obj/item/weapon/card/id/tempid = user.GetIdCard()
var/list/list_item = list()
if(vending)
list_item += "vend"
else
list_item += "stock"
list_item += tempid.registered_name
list_item += stationtime2text()
list_item += R.item_name
log[++log.len] = list_item
/mob/living/simple_mob/humanoid/starhunter/trader/proc/can_buy(datum/stored_item/vending_product/R, mob/user)
return TRUE
@@ -1,30 +1,30 @@
/mob/living/simple_mob/mechanical/cyber_horror/corgi
projectiletype = /obj/item/projectile/energy/mob/drone
/mob/living/simple_mob/mechanical/cyber_horror
maxHealth = 87
health = 87
/mob/living/simple_mob/mechanical/cyber_horror/plasma_cyber_horror
maxHealth = 37
health = 37
/mob/living/simple_mob/mechanical/cyber_horror/ling_cyber_horror
maxHealth = 125
health = 125
melee_damage_lower = 5
melee_damage_upper = 10
/mob/living/simple_mob/mechanical/cyber_horror/grey
maxHealth = 50
health = 50
//Direct Ranged Mob
/mob/living/simple_mob/mechanical/cyber_horror/corgi
maxHealth = 25
health = 25
//Cats and mayhem
/mob/living/simple_mob/mechanical/cyber_horror/cat_cyber_horror
maxHealth = 20
/mob/living/simple_mob/mechanical/cyber_horror/corgi
projectiletype = /obj/item/projectile/energy/mob/drone
/mob/living/simple_mob/mechanical/cyber_horror
maxHealth = 87
health = 87
/mob/living/simple_mob/mechanical/cyber_horror/plasma_cyber_horror
maxHealth = 37
health = 37
/mob/living/simple_mob/mechanical/cyber_horror/ling_cyber_horror
maxHealth = 125
health = 125
melee_damage_lower = 5
melee_damage_upper = 10
/mob/living/simple_mob/mechanical/cyber_horror/grey
maxHealth = 50
health = 50
//Direct Ranged Mob
/mob/living/simple_mob/mechanical/cyber_horror/corgi
maxHealth = 25
health = 25
//Cats and mayhem
/mob/living/simple_mob/mechanical/cyber_horror/cat_cyber_horror
maxHealth = 20
health = 20
@@ -1,133 +1,133 @@
/mob/living/simple_mob/mechanical/hivebot/precusor/chrono
name = "Advanced Precursor Hivebot"
icon = 'modular_chomp/icons/mob/hivebot.dmi'
icon_state = "precursorhive"
icon_living = "precursorhive"
attacktext = list("prodded")
maxHealth = 15 LASERS_TO_KILL
health = 15 LASERS_TO_KILL
projectiletype = /obj/item/projectile/arc/blue_energy/precusor
melee_damage_lower = 15
melee_damage_upper = 25
special_attack_min_range = 1
special_attack_max_range = 7
special_attack_cooldown = 5 SECONDS
movement_cooldown = 0.5
color = "#ccff4a"
projectilesound = 'sound/weapons/wave.ogg'
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/shooter/rubber
size_multiplier = 1.75
shock_resist = 3
water_resist = 3
attack_armor_pen = -50
armor = list(melee = -150, bullet = 40, laser = 40, energy = 40, bomb = 40, bio = 100, rad = 100)
armor_soak = list(
"melee" = 0,
"bullet" = 10,
"laser" = 10,
"energy" = 10,
"bomb" = 0,
"bio" = 0,
"rad" = 0
)
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
)
/mob/living/simple_mob/mechanical/hivebot/precusor/chrono/apply_melee_effects(atom/A)
if(isliving(A))
var/mob/living/L = A
L.taunt(src, TRUE)
L.add_modifier(/datum/modifier/hivebot_weaken, 3 SECONDS)
/mob/living/simple_mob/mechanical/hivebot/precusor/chrono/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/hivebot/precusor/chrono/proc/launch_microsingularity(atom/target)
set waitfor = FALSE
visible_message(span("warning", "\The [src] drops a ticking time bomb!"))
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 //CHOMPEdit
G.activate(src) //CHOMPEdit
set_AI_busy(FALSE)
/mob/living/simple_mob/mechanical/hivebot/precusor/chrono/proc/launch_rockets(atom/target)
set waitfor = FALSE
visible_message(span("warning", "\The [src] creates weak looking hivebots!"))
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/hivebot/precusor/chrono/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()
//Screw it scuffed way
/obj/item/weapon/grenade/spawnboss
desc = "It is set to detonate in 5 seconds. It will unleash an unspecified anomaly into the vicinity."
name = "delivery grenade"
icon = 'icons/obj/grenade.dmi'
icon_state = "delivery"
item_state = "flashbang"
origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4)
var/banglet = 0
var/spawner_type = null // must be an object path
var/deliveryamt = 1 // amount of type to deliver
/obj/item/weapon/grenade/spawnergrenade/detonate()
if(spawner_type && deliveryamt)
// Make a quick flash
var/turf/T = get_turf(src)
playsound(src, 'sound/effects/phasein.ogg', 100, 1)
for(var/i=1, i<=deliveryamt, i++)
var/atom/movable/x = new spawner_type(T)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(x, pick(NORTH,SOUTH,EAST,WEST))
qdel(src)
return
/obj/item/weapon/grenade/spawnboss/hivebot
spawner_type = /mob/living/simple_mob/mechanical/hivebot/swarm
/mob/living/simple_mob/mechanical/hivebot/precusor/chrono
name = "Advanced Precursor Hivebot"
icon = 'modular_chomp/icons/mob/hivebot.dmi'
icon_state = "precursorhive"
icon_living = "precursorhive"
attacktext = list("prodded")
maxHealth = 15 LASERS_TO_KILL
health = 15 LASERS_TO_KILL
projectiletype = /obj/item/projectile/arc/blue_energy/precusor
melee_damage_lower = 15
melee_damage_upper = 25
special_attack_min_range = 1
special_attack_max_range = 7
special_attack_cooldown = 5 SECONDS
movement_cooldown = 0.5
color = "#ccff4a"
projectilesound = 'sound/weapons/wave.ogg'
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/shooter/rubber
size_multiplier = 1.75
shock_resist = 3
water_resist = 3
attack_armor_pen = -50
armor = list(melee = -150, bullet = 40, laser = 40, energy = 40, bomb = 40, bio = 100, rad = 100)
armor_soak = list(
"melee" = 0,
"bullet" = 10,
"laser" = 10,
"energy" = 10,
"bomb" = 0,
"bio" = 0,
"rad" = 0
)
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
)
/mob/living/simple_mob/mechanical/hivebot/precusor/chrono/apply_melee_effects(atom/A)
if(isliving(A))
var/mob/living/L = A
L.taunt(src, TRUE)
L.add_modifier(/datum/modifier/hivebot_weaken, 3 SECONDS)
/mob/living/simple_mob/mechanical/hivebot/precusor/chrono/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/hivebot/precusor/chrono/proc/launch_microsingularity(atom/target)
set waitfor = FALSE
visible_message(span("warning", "\The [src] drops a ticking time bomb!"))
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 //CHOMPEdit
G.activate(src) //CHOMPEdit
set_AI_busy(FALSE)
/mob/living/simple_mob/mechanical/hivebot/precusor/chrono/proc/launch_rockets(atom/target)
set waitfor = FALSE
visible_message(span("warning", "\The [src] creates weak looking hivebots!"))
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/hivebot/precusor/chrono/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()
//Screw it scuffed way
/obj/item/weapon/grenade/spawnboss
desc = "It is set to detonate in 5 seconds. It will unleash an unspecified anomaly into the vicinity."
name = "delivery grenade"
icon = 'icons/obj/grenade.dmi'
icon_state = "delivery"
item_state = "flashbang"
origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4)
var/banglet = 0
var/spawner_type = null // must be an object path
var/deliveryamt = 1 // amount of type to deliver
/obj/item/weapon/grenade/spawnergrenade/detonate()
if(spawner_type && deliveryamt)
// Make a quick flash
var/turf/T = get_turf(src)
playsound(src, 'sound/effects/phasein.ogg', 100, 1)
for(var/i=1, i<=deliveryamt, i++)
var/atom/movable/x = new spawner_type(T)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(x, pick(NORTH,SOUTH,EAST,WEST))
qdel(src)
return
/obj/item/weapon/grenade/spawnboss/hivebot
spawner_type = /mob/living/simple_mob/mechanical/hivebot/swarm
deliveryamt = 3
@@ -1,4 +1,4 @@
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/laser
name = "laser hivebot"
desc = "A robot with a photonic weapon integrated into itself."
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/laser
name = "laser hivebot"
desc = "A robot with a photonic weapon integrated into itself."
projectiletype = /obj/item/projectile/energy/mob/drone
@@ -1,16 +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
/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.
@@ -1,56 +1,56 @@
//This hivebots are meant to be high threats, and a tad more fitting of the alien places they tend to be in. Aka mini-bosses.
/mob/living/simple_mob/mechanical/hivebot/precusor
name = "Precursor Hivebot"
icon = 'modular_chomp/icons/mob/hivebot.dmi'
icon_state = "precursorhive"
icon_living = "precursorhive"
attacktext = list("prodded")
maxHealth = 3 LASERS_TO_KILL // 150 health
health = 3 LASERS_TO_KILL
movement_cooldown = 4
melee_damage_lower = 15
melee_damage_upper = 15
var/obj/item/shield_projector/shields = null
loot_list = list(/obj/item/prop/alien/junk = 20,
/obj/item/prop/alien/junk = 20
)
/mob/living/simple_mob/mechanical/hivebot/precusor/Initialize(mapload)
shields = new /obj/item/shield_projector/rectangle/automatic/hivebot_drone(src)
return ..()
/mob/living/simple_mob/mechanical/hivebot/precusor/machinegun
projectiletype = /obj/item/projectile/bullet/hivebot
base_attack_cooldown = 0 // Extremly rapid fire with rather weak bullets.
/mob/living/simple_mob/mechanical/hivebot/precusor/laser
projectiletype = /obj/item/projectile/energy/mob/precursor
projectile_dispersion = 5
projectile_accuracy = -30
/mob/living/simple_mob/mechanical/hivebot/precusor/lobber
projectiletype = /obj/item/projectile/arc/blue_energy/precusor
/obj/item/projectile/arc/blue_energy/precusor
name = "energy missile"
icon_state = "force_missile"
armor_penetration = 10
damage = 50 // Mimics the precusor laser damage and armor peircing with a tad more damage because of the lobbying style.
damage_type = BURN
color = "#A020F0"
/obj/item/shield_projector/rectangle/automatic/hivebot_drone
shield_health = 50
max_shield_health = 50
shield_regen_delay = 5 SECONDS
shield_regen_amount = 20
size_x = 3
size_y = 3
color = "#A020F0"
high_color = "#A020F0"
//This hivebots are meant to be high threats, and a tad more fitting of the alien places they tend to be in. Aka mini-bosses.
/mob/living/simple_mob/mechanical/hivebot/precusor
name = "Precursor Hivebot"
icon = 'modular_chomp/icons/mob/hivebot.dmi'
icon_state = "precursorhive"
icon_living = "precursorhive"
attacktext = list("prodded")
maxHealth = 3 LASERS_TO_KILL // 150 health
health = 3 LASERS_TO_KILL
movement_cooldown = 4
melee_damage_lower = 15
melee_damage_upper = 15
var/obj/item/shield_projector/shields = null
loot_list = list(/obj/item/prop/alien/junk = 20,
/obj/item/prop/alien/junk = 20
)
/mob/living/simple_mob/mechanical/hivebot/precusor/Initialize(mapload)
shields = new /obj/item/shield_projector/rectangle/automatic/hivebot_drone(src)
return ..()
/mob/living/simple_mob/mechanical/hivebot/precusor/machinegun
projectiletype = /obj/item/projectile/bullet/hivebot
base_attack_cooldown = 0 // Extremly rapid fire with rather weak bullets.
/mob/living/simple_mob/mechanical/hivebot/precusor/laser
projectiletype = /obj/item/projectile/energy/mob/precursor
projectile_dispersion = 5
projectile_accuracy = -30
/mob/living/simple_mob/mechanical/hivebot/precusor/lobber
projectiletype = /obj/item/projectile/arc/blue_energy/precusor
/obj/item/projectile/arc/blue_energy/precusor
name = "energy missile"
icon_state = "force_missile"
armor_penetration = 10
damage = 50 // Mimics the precusor laser damage and armor peircing with a tad more damage because of the lobbying style.
damage_type = BURN
color = "#A020F0"
/obj/item/shield_projector/rectangle/automatic/hivebot_drone
shield_health = 50
max_shield_health = 50
shield_regen_delay = 5 SECONDS
shield_regen_amount = 20
size_x = 3
size_y = 3
color = "#A020F0"
high_color = "#A020F0"
low_color = "#A020F0"
@@ -1,5 +1,5 @@
//Giving the tank hivebot class a new look,
/mob/living/simple_mob/mechanical/hivebot/tank
icon = 'modular_chomp/icons/mob/hivebot.dmi'
icon_state = "blue"
//Giving the tank hivebot class a new look,
/mob/living/simple_mob/mechanical/hivebot/tank
icon = 'modular_chomp/icons/mob/hivebot.dmi'
icon_state = "blue"
icon_living = "blue"
@@ -1,46 +1,46 @@
/mob/living/simple_mob/mechanical/mecha/combat/durand
projectiletype = /obj/item/projectile/energy/mob/heavylaser
/mob/living/simple_mob/mechanical/mecha/combat/marauder
projectiletype = /obj/item/projectile/energy/mob/heavylaser
/mob/living/simple_mob/mechanical/mecha/hoverpod
projectiletype = /obj/item/projectile/energy/mob/smalllaser
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced
maxHealth = 225
/mob/living/simple_mob/mechanical/mecha/combat/durand
maxHealth = 200
melee_damage_lower = 20
melee_damage_upper = 20
/mob/living/simple_mob/mechanical/mecha/combat/gygax
maxHealth = 150
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark
maxHealth = 200
/mob/living/simple_mob/mechanical/mecha/combat/marauder
maxHealth = 250
melee_damage_lower = 22
melee_damage_upper = 22
/mob/living/simple_mob/mechanical/mecha/combat/marauder/seraph
health = 550
melee_damage_lower = 27
melee_damage_upper = 27
/mob/living/simple_mob/mechanical/mecha/odysseus
maxHealth = 60
/mob/living/simple_mob/mechanical/mecha/combat
melee_damage_lower = 15
melee_damage_upper = 15
/mob/living/simple_mob/mechanical/mecha/ripley
maxHealth = 100
// Immune to heat damage, resistant to lasers, and somewhat beefier. Still tries to melee you.
/mob/living/simple_mob/mechanical/mecha/ripley/firefighter
/mob/living/simple_mob/mechanical/mecha/combat/durand
projectiletype = /obj/item/projectile/energy/mob/heavylaser
/mob/living/simple_mob/mechanical/mecha/combat/marauder
projectiletype = /obj/item/projectile/energy/mob/heavylaser
/mob/living/simple_mob/mechanical/mecha/hoverpod
projectiletype = /obj/item/projectile/energy/mob/smalllaser
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced
maxHealth = 225
/mob/living/simple_mob/mechanical/mecha/combat/durand
maxHealth = 200
melee_damage_lower = 20
melee_damage_upper = 20
/mob/living/simple_mob/mechanical/mecha/combat/gygax
maxHealth = 150
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark
maxHealth = 200
/mob/living/simple_mob/mechanical/mecha/combat/marauder
maxHealth = 250
melee_damage_lower = 22
melee_damage_upper = 22
/mob/living/simple_mob/mechanical/mecha/combat/marauder/seraph
health = 550
melee_damage_lower = 27
melee_damage_upper = 27
/mob/living/simple_mob/mechanical/mecha/odysseus
maxHealth = 60
/mob/living/simple_mob/mechanical/mecha/combat
melee_damage_lower = 15
melee_damage_upper = 15
/mob/living/simple_mob/mechanical/mecha/ripley
maxHealth = 100
// Immune to heat damage, resistant to lasers, and somewhat beefier. Still tries to melee you.
/mob/living/simple_mob/mechanical/mecha/ripley/firefighter
maxHealth = 125
@@ -1,134 +1,134 @@
/mob/living/simple_mob/mechanical/mecha/combat/phazon
projectiletype = /obj/item/projectile/bullet/magnetic/fuelrod
/mob/living/simple_mob/mechanical/mecha/combat/phazon/advanced
name = "Advanced phazon"
movement_cooldown = 1
wreckage = /obj/structure/loot_pile/mecha/phazon
color = "#ffffff"
health = 250
maxHealth = 250
evasion = 10
special_attack_min_range = 1
special_attack_max_range = 9
special_attack_cooldown = 30 SECONDS
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
size_multiplier = 1.25
shock_resist = 0.5
ranged_attack_delay = 1 SECONDS
projectilesound = 'sound/weapons/gauss_shoot.ogg'
damage_fatigue_mult = 0
projectiletype = /obj/item/projectile/bullet/rifle/a545/ap
/mob/living/simple_mob/mechanical/mecha/combat/phazon/advanced/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/combat/phazon/advanced/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 red missile rack!"))
playsound(src, 'sound/effects/turret/move1.wav', 50, 1)
sleep(0.5 SECONDS)
for(var/i = 1 to 2)
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/big/rocket = new(loc)
rocket.old_style_target(T, src)
rocket.fire()
sleep(1 SECOND)
visible_message(span("warning", "\The [src] retracts the red missile rack."))
playsound(src, 'sound/effects/turret/move2.wav', 50, 1)
/obj/item/projectile/arc/explosive_rocket/big
name = "rocket"
icon_state = "mortar"
color = "#FF0000"
/obj/item/projectile/arc/explosive_rocket/big/on_impact(turf/T)
new /obj/effect/explosion(T) // Weak explosions don't produce this on their own, apparently.
explosion(T, 1, 1, 1, adminlog = FALSE)
/mob/living/simple_mob/mechanical/mecha/combat/phazon/advanced/proc/launch_rockets(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 blue missile rack!"))
playsound(src, 'sound/effects/turret/move1.wav', 50, 1)
sleep(0.5 SECONDS)
for(var/i = 1 to 2)
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 blue missile rack."))
playsound(src, 'sound/effects/turret/move2.wav', 50, 1)
/obj/item/projectile/arc/explosive_rocket/blue
name = "rocket"
icon_state = "mortar"
color = "#000066"
/obj/item/projectile/arc/explosive_rocket/blue/on_impact(turf/T)
new /obj/effect/explosion(T) // Weak explosions don't produce this on their own, apparently.
empulse(T, 1, 2, 3, 4)
/mob/living/simple_mob/mechanical/mecha/combat/phazon/advanced/proc/launch_microsingularity(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 yellow missile rack!"))
playsound(src, 'sound/effects/turret/move1.wav', 50, 1)
sleep(0.5 SECONDS)
for(var/i = 1 to 2)
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/spread/rocket = new(loc)
rocket.old_style_target(T, src)
rocket.fire()
sleep(1 SECOND)
visible_message(span("warning", "\The [src] retracts the yellow missile rack."))
playsound(src, 'sound/effects/turret/move2.wav', 50, 1)
/obj/item/projectile/arc/explosive_rocket/spread
name = "rocket"
icon_state = "mortar"
color = "#FFFF00"
/obj/item/projectile/arc/explosive_rocket/spread/on_impact(turf/T)
new /obj/effect/explosion(T) // Weak explosions don't produce this on their own, apparently.
explosion(T, 0, 0, 2, adminlog = FALSE)
/mob/living/simple_mob/mechanical/mecha/combat/phazon
projectiletype = /obj/item/projectile/bullet/magnetic/fuelrod
/mob/living/simple_mob/mechanical/mecha/combat/phazon/advanced
name = "Advanced phazon"
movement_cooldown = 1
wreckage = /obj/structure/loot_pile/mecha/phazon
color = "#ffffff"
health = 250
maxHealth = 250
evasion = 10
special_attack_min_range = 1
special_attack_max_range = 9
special_attack_cooldown = 30 SECONDS
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
size_multiplier = 1.25
shock_resist = 0.5
ranged_attack_delay = 1 SECONDS
projectilesound = 'sound/weapons/gauss_shoot.ogg'
damage_fatigue_mult = 0
projectiletype = /obj/item/projectile/bullet/rifle/a545/ap
/mob/living/simple_mob/mechanical/mecha/combat/phazon/advanced/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/combat/phazon/advanced/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 red missile rack!"))
playsound(src, 'sound/effects/turret/move1.wav', 50, 1)
sleep(0.5 SECONDS)
for(var/i = 1 to 2)
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/big/rocket = new(loc)
rocket.old_style_target(T, src)
rocket.fire()
sleep(1 SECOND)
visible_message(span("warning", "\The [src] retracts the red missile rack."))
playsound(src, 'sound/effects/turret/move2.wav', 50, 1)
/obj/item/projectile/arc/explosive_rocket/big
name = "rocket"
icon_state = "mortar"
color = "#FF0000"
/obj/item/projectile/arc/explosive_rocket/big/on_impact(turf/T)
new /obj/effect/explosion(T) // Weak explosions don't produce this on their own, apparently.
explosion(T, 1, 1, 1, adminlog = FALSE)
/mob/living/simple_mob/mechanical/mecha/combat/phazon/advanced/proc/launch_rockets(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 blue missile rack!"))
playsound(src, 'sound/effects/turret/move1.wav', 50, 1)
sleep(0.5 SECONDS)
for(var/i = 1 to 2)
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 blue missile rack."))
playsound(src, 'sound/effects/turret/move2.wav', 50, 1)
/obj/item/projectile/arc/explosive_rocket/blue
name = "rocket"
icon_state = "mortar"
color = "#000066"
/obj/item/projectile/arc/explosive_rocket/blue/on_impact(turf/T)
new /obj/effect/explosion(T) // Weak explosions don't produce this on their own, apparently.
empulse(T, 1, 2, 3, 4)
/mob/living/simple_mob/mechanical/mecha/combat/phazon/advanced/proc/launch_microsingularity(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 yellow missile rack!"))
playsound(src, 'sound/effects/turret/move1.wav', 50, 1)
sleep(0.5 SECONDS)
for(var/i = 1 to 2)
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/spread/rocket = new(loc)
rocket.old_style_target(T, src)
rocket.fire()
sleep(1 SECOND)
visible_message(span("warning", "\The [src] retracts the yellow missile rack."))
playsound(src, 'sound/effects/turret/move2.wav', 50, 1)
/obj/item/projectile/arc/explosive_rocket/spread
name = "rocket"
icon_state = "mortar"
color = "#FFFF00"
/obj/item/projectile/arc/explosive_rocket/spread/on_impact(turf/T)
new /obj/effect/explosion(T) // Weak explosions don't produce this on their own, apparently.
explosion(T, 0, 0, 2, adminlog = FALSE)
@@ -1,5 +1,5 @@
/mob/living/simple_mob/metroid/juvenile/gamma
projectiletype = /obj/item/projectile/energy/mob/electric_spider
/mob/living/simple_mob/metroid/juvenile/omega
/mob/living/simple_mob/metroid/juvenile/gamma
projectiletype = /obj/item/projectile/energy/mob/electric_spider
/mob/living/simple_mob/metroid/juvenile/omega
projectiletype = /obj/item/projectile/energy/mob/smalllaser
@@ -1,26 +1,26 @@
/mob/living/simple_mob/construct/artificer/caster
projectiletype = /obj/item/projectile/energy/inversion
/mob/living/simple_mob/construct/artificer
maxHealth = 50
health = 50
melee_damage_lower = 7
melee_damage_upper = 10
/mob/living/simple_mob/construct/harvester
maxHealth = 50
health = 50
melee_damage_lower = 10
melee_damage_upper = 12
/mob/living/simple_mob/construct/wraith
maxHealth = 100
health = 100
melee_damage_lower = 12
melee_damage_upper = 15
/mob/living/simple_mob/construct/harvester/greater
maxHealth = 50
health = 50
melee_damage_lower = 20
/mob/living/simple_mob/construct/artificer/caster
projectiletype = /obj/item/projectile/energy/inversion
/mob/living/simple_mob/construct/artificer
maxHealth = 50
health = 50
melee_damage_lower = 7
melee_damage_upper = 10
/mob/living/simple_mob/construct/harvester
maxHealth = 50
health = 50
melee_damage_lower = 10
melee_damage_upper = 12
/mob/living/simple_mob/construct/wraith
maxHealth = 100
health = 100
melee_damage_lower = 12
melee_damage_upper = 15
/mob/living/simple_mob/construct/harvester/greater
maxHealth = 50
health = 50
melee_damage_lower = 20
melee_damage_upper = 25
@@ -1,51 +1,51 @@
/mob/living/simple_mob/construct/juggernaut
maxHealth = 100
health = 100
melee_damage_lower = 15
melee_damage_upper = 20
/mob/living/simple_mob/construct/juggernaut/behemoth
maxHealth = 300
health = 300
/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable
name = "Behemoth"
real_name = "Behemoth"
desc = "The pinnacle of occult technology, Behemoths are nothing shy of both an Immovable Object, and Unstoppable Force."
melee_damage_lower = 22
melee_damage_upper = 33
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
projectiletype = /obj/item/projectile/energy/inversion
movement_cooldown = 1
loot_list = list(/obj/item/weapon/rig/ch/aegis = 100)
/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable/bullet_act(var/obj/item/projectile/P)
var/reflectchance = 100 - round(P.damage*2)
if(prob(reflectchance))
visible_message("<span class='danger'>The [P.name] gets reflected by [src]'s shell!</span>", \
"<span class='userdanger'>The [P.name] gets reflected by [src]'s shell!</span>")
// 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))
/obj/item/projectile/energy/electrode/cult
color = "#FFFFFF"
agony = 0
damage = 15
damage_type = BURN
check_armour = "laser"
/mob/living/simple_mob/construct/juggernaut
maxHealth = 100
health = 100
melee_damage_lower = 15
melee_damage_upper = 20
/mob/living/simple_mob/construct/juggernaut/behemoth
maxHealth = 300
health = 300
/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable
name = "Behemoth"
real_name = "Behemoth"
desc = "The pinnacle of occult technology, Behemoths are nothing shy of both an Immovable Object, and Unstoppable Force."
melee_damage_lower = 22
melee_damage_upper = 33
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
projectiletype = /obj/item/projectile/energy/inversion
movement_cooldown = 1
loot_list = list(/obj/item/weapon/rig/ch/aegis = 100)
/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable/bullet_act(var/obj/item/projectile/P)
var/reflectchance = 100 - round(P.damage*2)
if(prob(reflectchance))
visible_message("<span class='danger'>The [P.name] gets reflected by [src]'s shell!</span>", \
"<span class='userdanger'>The [P.name] gets reflected by [src]'s shell!</span>")
// 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))
/obj/item/projectile/energy/electrode/cult
color = "#FFFFFF"
agony = 0
damage = 15
damage_type = BURN
check_armour = "laser"
armor_penetration = 60
@@ -1,299 +1,299 @@
/mob/living/simple_mob/slime/feral
cores = 3 // Xenobio will love getting their hands on these.
maxHealth = 75
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
/mob/living/simple_mob/slime/feral
cores = 3 // Xenobio will love getting their hands on these.
maxHealth = 75
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)
@@ -1,14 +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
/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
@@ -1,12 +1,12 @@
/mob/living/simple_mob/vore/aggressive/rat
maxHealth = 75
health = 75
/mob/living/simple_mob/vore/aggressive/rat/phoron
maxHealth = 87
health = 87
/mob/living/simple_mob/vore/aggressive/rat/event
maxHealth = 25
/mob/living/simple_mob/vore/aggressive/rat
maxHealth = 75
health = 75
/mob/living/simple_mob/vore/aggressive/rat/phoron
maxHealth = 87
health = 87
/mob/living/simple_mob/vore/aggressive/rat/event
maxHealth = 25
health = 25
File diff suppressed because it is too large Load Diff
@@ -1,49 +1,49 @@
/mob/living/simple_mob/shadekin
var/phase_gentle = 0
/mob/living/simple_mob/shadekin/Login()
. = ..()
verbs |= /mob/living/simple_mob/shadekin/proc/phase_strength_toggle
// Allow horizontal resting
/mob/living/simple_mob/shadekin/update_transform()
update_transform_horizontal()
//custom light flicker proc
/mob/living/simple_mob/shadekin/proc/handle_phasein_flicker()
if(phase_gentle) // gentle case: No light destruction. Flicker in 4 tile radius for 3s. Weaken for 3sec after
for(var/obj/machinery/light/L in machines)
if(L.z != z || get_dist(src,L) > 4)
continue
L.flicker(3)
src.Stun(3)
else //normal case. Flicker in 10 tile radius for 10s. chance to destroy light based on eye type.
var/destroy_lights = 0
if(eye_state == RED_EYES)
destroy_lights = 80
if(eye_state == PURPLE_EYES)
destroy_lights = 25
for(var/obj/machinery/light/L in machines)
if(L.z != z || get_dist(src,L) > 10)
continue
if(prob(destroy_lights))
spawn(rand(5,25))
L.broken()
else
L.flicker(10)
//toggle proc for toggling gentle/normal phasing
/mob/living/simple_mob/shadekin/proc/phase_strength_toggle()
set name = "Toggle Phase Strength"
set desc = "Toggle strength of phase. Gentle but slower, or faster but destructive to lights."
set category = "Abilities"
if(phase_gentle)
to_chat(src, "<span class='notice'>Phasing toggled to Normal. You may damage lights.</span>")
phase_gentle = 0
else
to_chat(src, "<span class='notice'>Phasing toggled to Gentle. You won't damage lights, but concentrating on that incurs a short stun.</span>")
/mob/living/simple_mob/shadekin
var/phase_gentle = 0
/mob/living/simple_mob/shadekin/Login()
. = ..()
verbs |= /mob/living/simple_mob/shadekin/proc/phase_strength_toggle
// Allow horizontal resting
/mob/living/simple_mob/shadekin/update_transform()
update_transform_horizontal()
//custom light flicker proc
/mob/living/simple_mob/shadekin/proc/handle_phasein_flicker()
if(phase_gentle) // gentle case: No light destruction. Flicker in 4 tile radius for 3s. Weaken for 3sec after
for(var/obj/machinery/light/L in machines)
if(L.z != z || get_dist(src,L) > 4)
continue
L.flicker(3)
src.Stun(3)
else //normal case. Flicker in 10 tile radius for 10s. chance to destroy light based on eye type.
var/destroy_lights = 0
if(eye_state == RED_EYES)
destroy_lights = 80
if(eye_state == PURPLE_EYES)
destroy_lights = 25
for(var/obj/machinery/light/L in machines)
if(L.z != z || get_dist(src,L) > 10)
continue
if(prob(destroy_lights))
spawn(rand(5,25))
L.broken()
else
L.flicker(10)
//toggle proc for toggling gentle/normal phasing
/mob/living/simple_mob/shadekin/proc/phase_strength_toggle()
set name = "Toggle Phase Strength"
set desc = "Toggle strength of phase. Gentle but slower, or faster but destructive to lights."
set category = "Abilities"
if(phase_gentle)
to_chat(src, "<span class='notice'>Phasing toggled to Normal. You may damage lights.</span>")
phase_gentle = 0
else
to_chat(src, "<span class='notice'>Phasing toggled to Gentle. You won't damage lights, but concentrating on that incurs a short stun.</span>")
phase_gentle = 1
@@ -1,53 +1,53 @@
/mob/living/simple_mob/vore/smokestar
name = "strange creature"
desc = "What is that?"
icon = 'modular_chomp/icons/mob/smokestar.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 = "smokestar"
maxHealth = 200
health = 200
movement_cooldown = 0
melee_attack_delay = 1.5 SECOND
can_be_drop_prey = TRUE
unsuitable_atoms_damage = 0
melee_miss_chance = 0
hovering = TRUE
pass_flags = PASSTABLE
melee_damage_lower = 8
melee_damage_upper = 15
damage_fatigue_mult = 0
armor = list(
"melee" = 30,
"bullet" = 30,
"laser" = 30,
"energy" = 30,
"bomb" = 30,
"bio" = 100,
"rad" = 100
)
/*
/mob/living/simple_mob/vore/smokestar/wendigo
/mob/living/simple_mob/vore/smokestar/behemoth
/mob/living/simple_mob/vore/smokestar/banshee
*/
//All the Ai and such is place holder.
/mob/living/simple_mob/vore/smokestar/drider
icon_state = "drideralive"
icon_living = "drideralive"
icon_dead = "driderdead"
glow_color = "#1F000F"
light_color = "#1F000F"
glow_range = 5
glow_intensity = -1
/mob/living/simple_mob/vore/smokestar
name = "strange creature"
desc = "What is that?"
icon = 'modular_chomp/icons/mob/smokestar.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 = "smokestar"
maxHealth = 200
health = 200
movement_cooldown = 0
melee_attack_delay = 1.5 SECOND
can_be_drop_prey = TRUE
unsuitable_atoms_damage = 0
melee_miss_chance = 0
hovering = TRUE
pass_flags = PASSTABLE
melee_damage_lower = 8
melee_damage_upper = 15
damage_fatigue_mult = 0
armor = list(
"melee" = 30,
"bullet" = 30,
"laser" = 30,
"energy" = 30,
"bomb" = 30,
"bio" = 100,
"rad" = 100
)
/*
/mob/living/simple_mob/vore/smokestar/wendigo
/mob/living/simple_mob/vore/smokestar/behemoth
/mob/living/simple_mob/vore/smokestar/banshee
*/
//All the Ai and such is place holder.
/mob/living/simple_mob/vore/smokestar/drider
icon_state = "drideralive"
icon_living = "drideralive"
icon_dead = "driderdead"
glow_color = "#1F000F"
light_color = "#1F000F"
glow_range = 5
glow_intensity = -1
ai_holder_type = /datum/ai_holder/simple_mob/melee/hit_and_run