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,7 +1,7 @@
/datum/gear/plushieteshcolor
display_name = "plushie, lifelike teshari, colorable"
path = /obj/item/toy/plushie/teshari/w_yw
/datum/gear/plushieteshcolor/New()
..()
/datum/gear/plushieteshcolor
display_name = "plushie, lifelike teshari, colorable"
path = /obj/item/toy/plushie/teshari/w_yw
/datum/gear/plushieteshcolor/New()
..()
gear_tweaks += gear_tweak_free_color_choice
@@ -1,12 +1,12 @@
/datum/gear/shoes/mech_shoes
display_name = "mech shoes selection"
path = /obj/item/clothing/shoes/mech_shoes
cost = 1
/datum/gear/shoes/mech_shoes/New()
..()
var/list/mechshoes = list(
"heavy mech shoes" = /obj/item/clothing/shoes/mech_shoes,
"light mech shoes" = /obj/item/clothing/shoes/mech_shoes/light
)
/datum/gear/shoes/mech_shoes
display_name = "mech shoes selection"
path = /obj/item/clothing/shoes/mech_shoes
cost = 1
/datum/gear/shoes/mech_shoes/New()
..()
var/list/mechshoes = list(
"heavy mech shoes" = /obj/item/clothing/shoes/mech_shoes,
"light mech shoes" = /obj/item/clothing/shoes/mech_shoes/light
)
gear_tweaks += new/datum/gear_tweak/path(mechshoes)
@@ -1,28 +1,28 @@
/datum/gear/suit/pcarrier // No protection until inserted with plates, purely for cosmetic purposes.
display_name = "Plate Carrier selection (Security/Exploration)"
path = /obj/item/clothing/suit/armor/pcarrier
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Pathfinder", "Field Medic", "Pilot", "Explorer")
cost = 2
/datum/gear/suit/pcarrier/New()
..()
var/list/pcarriers = list(
"Black Plate Carrier" = /obj/item/clothing/suit/armor/pcarrier,
"Navy Plate Carrier" = /obj/item/clothing/suit/armor/pcarrier/navy,
"Blue Plate Carrier" = /obj/item/clothing/suit/armor/pcarrier/blue,
"Light Blue Plate Carrier" = /obj/item/clothing/suit/armor/pcarrier/press,
"Green Plate Carrier" = /obj/item/clothing/suit/armor/pcarrier/green,
"Tan Plate Carrier" = /obj/item/clothing/suit/armor/pcarrier/tan
)
gear_tweaks += new/datum/gear_tweak/path(pcarriers)
/datum/gear/suit/winterhood
display_name = "Winter Hood"
path = /obj/item/clothing/head/hood/winter
cost = 0
/datum/gear/suit/martianminer
display_name = "Martian Miner Coat"
path = /obj/item/clothing/suit/storage/vest/martian_miner/unarmored
/datum/gear/suit/pcarrier // No protection until inserted with plates, purely for cosmetic purposes.
display_name = "Plate Carrier selection (Security/Exploration)"
path = /obj/item/clothing/suit/armor/pcarrier
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Pathfinder", "Field Medic", "Pilot", "Explorer")
cost = 2
/datum/gear/suit/pcarrier/New()
..()
var/list/pcarriers = list(
"Black Plate Carrier" = /obj/item/clothing/suit/armor/pcarrier,
"Navy Plate Carrier" = /obj/item/clothing/suit/armor/pcarrier/navy,
"Blue Plate Carrier" = /obj/item/clothing/suit/armor/pcarrier/blue,
"Light Blue Plate Carrier" = /obj/item/clothing/suit/armor/pcarrier/press,
"Green Plate Carrier" = /obj/item/clothing/suit/armor/pcarrier/green,
"Tan Plate Carrier" = /obj/item/clothing/suit/armor/pcarrier/tan
)
gear_tweaks += new/datum/gear_tweak/path(pcarriers)
/datum/gear/suit/winterhood
display_name = "Winter Hood"
path = /obj/item/clothing/head/hood/winter
cost = 0
/datum/gear/suit/martianminer
display_name = "Martian Miner Coat"
path = /obj/item/clothing/suit/storage/vest/martian_miner/unarmored
cost = 1
@@ -1,193 +1,193 @@
//vr section
/obj/item/clothing/head/vrwizard
name = "wizard hat"
desc = "A pointy pixelated-looking hat, 0s and 1s dancing off the fabric"
icon_state = "redwizard"
armor = list(melee = 20, bullet = 20, laser = 60, energy = 60, bomb = 70, bio = 50, rad = 50)
siemens_coefficient = 0.1
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
min_pressure_protection = 0 * ONE_ATMOSPHERE
max_pressure_protection = 3 * ONE_ATMOSPHERE
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/suit/vrwizard
name = "wizard robes"
desc = "A silky robe with 0s and 1s flying off the seams."
icon_state = "redwizard"
armor = list(melee = 20, bullet = 20, laser = 60, energy = 60, bomb = 70, bio = 50, rad = 50)
siemens_coefficient = 0.1
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
min_pressure_protection = 0 * ONE_ATMOSPHERE
max_pressure_protection = 3 * ONE_ATMOSPHERE
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency/oxygen)
/obj/item/clothing/head/darkvrwizard
name = "wizard hat"
desc = "The hat holding the most attack and defense"
icon_state = "redwizard"
color = "#660066"
armor = list(melee = 70, bullet = 70, laser = 40, energy = 40, bomb = 90, bio = 70, rad = 70)
siemens_coefficient = 0.1
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
min_pressure_protection = 0 * ONE_ATMOSPHERE
max_pressure_protection = 3 * ONE_ATMOSPHERE
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/suit/darkvrwizard
name = "wizard robes"
desc = "Robes holding the most attack and defense."
icon_state = "psyamp"
armor = list(melee = 70, bullet = 70, laser = 40, energy = 40, bomb = 90, bio = 70, rad = 70)
siemens_coefficient = 0.1
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
min_pressure_protection = 0 * ONE_ATMOSPHERE
max_pressure_protection = 3 * ONE_ATMOSPHERE
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency/oxygen)
//Candy section
/obj/item/clothing/head/psy_crown/candycrown
name = "candy crown"
desc = "A crown smelling oddly sweet"
description_info = "It will occasionally give a momentary buff to offensive capablities."
icon_state = "wrathcrown"
cooldown_duration = 1 MINUTES // How long the cooldown should be.
brainloss_cost = 0
armor = list(melee = 70, bullet = 60, laser = 50, energy = 50, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/head/psy_crown/candycrown/activate_ability(var/mob/living/wearer)
..()
wearer.add_modifier(/datum/modifier/aura/candy_orange, 30 SECONDS)
/obj/item/clothing/gloves/stamina
name = "gloves of stamina"
desc = "A strange pair of gloves."
description_info = "It has a strange property of restoring hunger."
icon_state = "regen"
item_state = "graygloves"
siemens_coefficient = 0
armor = list(melee = 70, bullet = 60, laser = 50, energy = 50, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/gloves/stamina/equipped(var/mob/living/carbon/human/H)
if(H && H.gloves == src)
wearer = H
if(wearer.can_feel_pain())
to_chat(H, "<span class='danger'>You feel strange as hunger vanishes!</span>")
wearer.custom_pain("Your hands feel strange!",1)
..()
/obj/item/clothing/gloves/stamina/dropped(var/mob/living/carbon/human/H)
..()
if(wearer)
if(wearer.can_feel_pain())
to_chat(wearer, "<span class='danger'>You feel hungry!</span>")
wearer.custom_pain("Your hands feel strange",1)
wearer = null
/obj/item/clothing/gloves/stamina/New()
START_PROCESSING(SSobj, src)
..()
/obj/item/clothing/gloves/stamina/Destroy()
wearer = null
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/gloves/stamina/process()
if(!wearer || wearer.isSynthetic() || wearer.stat == DEAD)
return // Robots and dead people don't have a metabolism.
wearer.nutrition = max(wearer.nutrition + 8, 0)
/obj/item/clothing/suit/armor/buffvest
name = "candy armor"
desc = "A really strange armor made of a similar substance as the creatures near it."
icon_state = "armor"
blood_overlay_type = "armor"
armor = list(melee = 70, bullet = 60, laser = 50, energy = 50, bomb = 0, bio = 0, rad = 0)
var/tension_threshold = 125
var/cooldown = null // world.time of when this was last triggered.
var/cooldown_duration = 3 MINUTES // How long the cooldown should be.
var/flavor_equip = null // Message displayed to someone who puts this on their head. Drones don't get a message.
var/flavor_unequip = null // Ditto, but for taking it off.
var/flavor_drop = null // Ditto, but for dropping it.
var/flavor_activate = null // Ditto, for but activating.
var/brainloss_cost = 0
/obj/item/clothing/suit/armor/buffvest/proc/activate_ability(var/mob/living/wearer)
cooldown = world.time + cooldown_duration
to_chat(wearer, flavor_activate)
to_chat(wearer, "<span class='danger'>The inside of your head hurts...</span>")
wearer.adjustBrainLoss(brainloss_cost)
wearer.add_modifier(/datum/modifier/aura/candy_blue, 30 SECONDS)
/obj/item/clothing/suit/armor/buffvest/equipped(var/mob/living/carbon/human/H)
..()
if(istype(H) && H.head == src && H.is_sentient())
START_PROCESSING(SSobj, src)
to_chat(H, flavor_equip)
/obj/item/clothing/suit/armor/buffvest/dropped(var/mob/living/carbon/human/H)
..()
STOP_PROCESSING(SSobj, src)
if(H.is_sentient())
if(loc == H) // Still inhand.
to_chat(H, flavor_unequip)
else
to_chat(H, flavor_drop)
/obj/item/clothing/suit/armor/buffvest/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/suit/armor/buffvest/process()
if(isliving(loc))
var/mob/living/L = loc
if(world.time >= cooldown && L.is_sentient() && L.get_tension() >= tension_threshold)
activate_ability(L)
//vistor section
/obj/item/clothing/suit/armor/alien/vistor
name = "rocky suit"
desc = "A strange set of armor made of rocky plates"
description_info = "It always reduces all damage by the same amount, with a 12% chance to block."
icon_state = "alien_tank"
slowdown = 0
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
armorsoak = list( melee = 12, bullet = 12,laser = 12, energy = 12 , bomb = 0, bio = 0, rad = 0)
block_chance = 12
/obj/item/clothing/suit/armor/tesla/vistor
name = "zapping suit"
desc = "A strange set of armor crackling with lighting"
slowdown = 0
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/reactive/vistor
name = "vibrating suit"
desc = "A strange set of armor that crackles with energy"
icon_state = "reactiveoff"
slowdown = 0
armor = list(melee = 35, bullet = 35, laser = 35, energy = 35, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/protectionbubble
name = "protective bubble"
desc = "A strange set of armor that seems to coat your entire body in a thing protective bubble"
icon_state = "armor"
blood_overlay_type = "armor"
armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 100, rad = 75)
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
min_pressure_protection = 0 * ONE_ATMOSPHERE
max_pressure_protection = 15 * ONE_ATMOSPHERE
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
//vr section
/obj/item/clothing/head/vrwizard
name = "wizard hat"
desc = "A pointy pixelated-looking hat, 0s and 1s dancing off the fabric"
icon_state = "redwizard"
armor = list(melee = 20, bullet = 20, laser = 60, energy = 60, bomb = 70, bio = 50, rad = 50)
siemens_coefficient = 0.1
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
min_pressure_protection = 0 * ONE_ATMOSPHERE
max_pressure_protection = 3 * ONE_ATMOSPHERE
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/suit/vrwizard
name = "wizard robes"
desc = "A silky robe with 0s and 1s flying off the seams."
icon_state = "redwizard"
armor = list(melee = 20, bullet = 20, laser = 60, energy = 60, bomb = 70, bio = 50, rad = 50)
siemens_coefficient = 0.1
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
min_pressure_protection = 0 * ONE_ATMOSPHERE
max_pressure_protection = 3 * ONE_ATMOSPHERE
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency/oxygen)
/obj/item/clothing/head/darkvrwizard
name = "wizard hat"
desc = "The hat holding the most attack and defense"
icon_state = "redwizard"
color = "#660066"
armor = list(melee = 70, bullet = 70, laser = 40, energy = 40, bomb = 90, bio = 70, rad = 70)
siemens_coefficient = 0.1
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
min_pressure_protection = 0 * ONE_ATMOSPHERE
max_pressure_protection = 3 * ONE_ATMOSPHERE
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/suit/darkvrwizard
name = "wizard robes"
desc = "Robes holding the most attack and defense."
icon_state = "psyamp"
armor = list(melee = 70, bullet = 70, laser = 40, energy = 40, bomb = 90, bio = 70, rad = 70)
siemens_coefficient = 0.1
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
min_pressure_protection = 0 * ONE_ATMOSPHERE
max_pressure_protection = 3 * ONE_ATMOSPHERE
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency/oxygen)
//Candy section
/obj/item/clothing/head/psy_crown/candycrown
name = "candy crown"
desc = "A crown smelling oddly sweet"
description_info = "It will occasionally give a momentary buff to offensive capablities."
icon_state = "wrathcrown"
cooldown_duration = 1 MINUTES // How long the cooldown should be.
brainloss_cost = 0
armor = list(melee = 70, bullet = 60, laser = 50, energy = 50, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/head/psy_crown/candycrown/activate_ability(var/mob/living/wearer)
..()
wearer.add_modifier(/datum/modifier/aura/candy_orange, 30 SECONDS)
/obj/item/clothing/gloves/stamina
name = "gloves of stamina"
desc = "A strange pair of gloves."
description_info = "It has a strange property of restoring hunger."
icon_state = "regen"
item_state = "graygloves"
siemens_coefficient = 0
armor = list(melee = 70, bullet = 60, laser = 50, energy = 50, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/gloves/stamina/equipped(var/mob/living/carbon/human/H)
if(H && H.gloves == src)
wearer = H
if(wearer.can_feel_pain())
to_chat(H, "<span class='danger'>You feel strange as hunger vanishes!</span>")
wearer.custom_pain("Your hands feel strange!",1)
..()
/obj/item/clothing/gloves/stamina/dropped(var/mob/living/carbon/human/H)
..()
if(wearer)
if(wearer.can_feel_pain())
to_chat(wearer, "<span class='danger'>You feel hungry!</span>")
wearer.custom_pain("Your hands feel strange",1)
wearer = null
/obj/item/clothing/gloves/stamina/New()
START_PROCESSING(SSobj, src)
..()
/obj/item/clothing/gloves/stamina/Destroy()
wearer = null
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/gloves/stamina/process()
if(!wearer || wearer.isSynthetic() || wearer.stat == DEAD)
return // Robots and dead people don't have a metabolism.
wearer.nutrition = max(wearer.nutrition + 8, 0)
/obj/item/clothing/suit/armor/buffvest
name = "candy armor"
desc = "A really strange armor made of a similar substance as the creatures near it."
icon_state = "armor"
blood_overlay_type = "armor"
armor = list(melee = 70, bullet = 60, laser = 50, energy = 50, bomb = 0, bio = 0, rad = 0)
var/tension_threshold = 125
var/cooldown = null // world.time of when this was last triggered.
var/cooldown_duration = 3 MINUTES // How long the cooldown should be.
var/flavor_equip = null // Message displayed to someone who puts this on their head. Drones don't get a message.
var/flavor_unequip = null // Ditto, but for taking it off.
var/flavor_drop = null // Ditto, but for dropping it.
var/flavor_activate = null // Ditto, for but activating.
var/brainloss_cost = 0
/obj/item/clothing/suit/armor/buffvest/proc/activate_ability(var/mob/living/wearer)
cooldown = world.time + cooldown_duration
to_chat(wearer, flavor_activate)
to_chat(wearer, "<span class='danger'>The inside of your head hurts...</span>")
wearer.adjustBrainLoss(brainloss_cost)
wearer.add_modifier(/datum/modifier/aura/candy_blue, 30 SECONDS)
/obj/item/clothing/suit/armor/buffvest/equipped(var/mob/living/carbon/human/H)
..()
if(istype(H) && H.head == src && H.is_sentient())
START_PROCESSING(SSobj, src)
to_chat(H, flavor_equip)
/obj/item/clothing/suit/armor/buffvest/dropped(var/mob/living/carbon/human/H)
..()
STOP_PROCESSING(SSobj, src)
if(H.is_sentient())
if(loc == H) // Still inhand.
to_chat(H, flavor_unequip)
else
to_chat(H, flavor_drop)
/obj/item/clothing/suit/armor/buffvest/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/suit/armor/buffvest/process()
if(isliving(loc))
var/mob/living/L = loc
if(world.time >= cooldown && L.is_sentient() && L.get_tension() >= tension_threshold)
activate_ability(L)
//vistor section
/obj/item/clothing/suit/armor/alien/vistor
name = "rocky suit"
desc = "A strange set of armor made of rocky plates"
description_info = "It always reduces all damage by the same amount, with a 12% chance to block."
icon_state = "alien_tank"
slowdown = 0
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
armorsoak = list( melee = 12, bullet = 12,laser = 12, energy = 12 , bomb = 0, bio = 0, rad = 0)
block_chance = 12
/obj/item/clothing/suit/armor/tesla/vistor
name = "zapping suit"
desc = "A strange set of armor crackling with lighting"
slowdown = 0
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/reactive/vistor
name = "vibrating suit"
desc = "A strange set of armor that crackles with energy"
icon_state = "reactiveoff"
slowdown = 0
armor = list(melee = 35, bullet = 35, laser = 35, energy = 35, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/protectionbubble
name = "protective bubble"
desc = "A strange set of armor that seems to coat your entire body in a thing protective bubble"
icon_state = "armor"
blood_overlay_type = "armor"
armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 100, rad = 75)
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
min_pressure_protection = 0 * ONE_ATMOSPHERE
max_pressure_protection = 15 * ONE_ATMOSPHERE
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
//scrap section which is on hold till I get foes
@@ -1,137 +1,137 @@
/obj/item/weapon/rig/ch/aegis
name = "aegis control module"
desc = "A hefty armor formed from fallen redspace construct."
suit_type = "aegis hardsuit"
icon = 'modular_chomp/icons/obj/rig_modules_ch.dmi'
icon_state = "aegis_rig"
armor = list(melee = 60, bullet = 60, laser = 60, energy = 30, bomb = 10, bio = 100, rad = 100)
slowdown = 6
chest_type = /obj/item/clothing/suit/space/rig/ch/aegis
helm_type = /obj/item/clothing/head/helmet/space/rig/ch/aegis
glove_type = /obj/item/clothing/gloves/gauntlets/rig/ch/aegis
boot_type = /obj/item/clothing/shoes/magboots/rig/ch/aegis
/obj/item/clothing/suit/space/rig/ch/aegis
name = "chassis"
icon = 'icons/obj/clothing/spacesuits_ch.dmi'
desc = "A heft chestplate, humming with energy."
/obj/item/clothing/head/helmet/space/rig/ch/aegis
name = "helmet"
icon = 'icons/obj/clothing/hats_ch.dmi'
desc = "A protective dome for your head."
/obj/item/clothing/gloves/gauntlets/rig/ch/aegis
name = "hardlight gloves"
icon = 'icons/obj/clothing/gloves_ch.dmi'
desc = "Gloves created with alien tech"
var/block_chance = 15
/obj/item/clothing/shoes/magboots/rig/ch/aegis
name = "hardlight boots"
icon = 'icons/obj/clothing/shoes_ch.dmi'
desc = "A pair of grabby boots"
/obj/item/weapon/rig/ch/aegis/bullet_act(var/obj/item/projectile/P)
var/reflectchance = 70 - round(P.damage)
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/clothing/suit/space/rig/ch/aegis/bullet_act(var/obj/item/projectile/P)
var/reflectchance = 70 - round(P.damage)
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/clothing/head/helmet/space/rig/ch/aegis/bullet_act(var/obj/item/projectile/P)
var/reflectchance = 70 - round(P.damage)
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/clothing/gloves/gauntlets/rig/ch/aegis/bullet_act(var/obj/item/projectile/P)
var/reflectchance = 70 - round(P.damage)
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/clothing/shoes/magboots/rig/ch/aegis/bullet_act(var/obj/item/projectile/P)
var/reflectchance = 70 - round(P.damage)
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
/obj/item/weapon/rig/ch/aegis
name = "aegis control module"
desc = "A hefty armor formed from fallen redspace construct."
suit_type = "aegis hardsuit"
icon = 'modular_chomp/icons/obj/rig_modules_ch.dmi'
icon_state = "aegis_rig"
armor = list(melee = 60, bullet = 60, laser = 60, energy = 30, bomb = 10, bio = 100, rad = 100)
slowdown = 6
chest_type = /obj/item/clothing/suit/space/rig/ch/aegis
helm_type = /obj/item/clothing/head/helmet/space/rig/ch/aegis
glove_type = /obj/item/clothing/gloves/gauntlets/rig/ch/aegis
boot_type = /obj/item/clothing/shoes/magboots/rig/ch/aegis
/obj/item/clothing/suit/space/rig/ch/aegis
name = "chassis"
icon = 'icons/obj/clothing/spacesuits_ch.dmi'
desc = "A heft chestplate, humming with energy."
/obj/item/clothing/head/helmet/space/rig/ch/aegis
name = "helmet"
icon = 'icons/obj/clothing/hats_ch.dmi'
desc = "A protective dome for your head."
/obj/item/clothing/gloves/gauntlets/rig/ch/aegis
name = "hardlight gloves"
icon = 'icons/obj/clothing/gloves_ch.dmi'
desc = "Gloves created with alien tech"
var/block_chance = 15
/obj/item/clothing/shoes/magboots/rig/ch/aegis
name = "hardlight boots"
icon = 'icons/obj/clothing/shoes_ch.dmi'
desc = "A pair of grabby boots"
/obj/item/weapon/rig/ch/aegis/bullet_act(var/obj/item/projectile/P)
var/reflectchance = 70 - round(P.damage)
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/clothing/suit/space/rig/ch/aegis/bullet_act(var/obj/item/projectile/P)
var/reflectchance = 70 - round(P.damage)
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/clothing/head/helmet/space/rig/ch/aegis/bullet_act(var/obj/item/projectile/P)
var/reflectchance = 70 - round(P.damage)
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/clothing/gloves/gauntlets/rig/ch/aegis/bullet_act(var/obj/item/projectile/P)
var/reflectchance = 70 - round(P.damage)
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/clothing/shoes/magboots/rig/ch/aegis/bullet_act(var/obj/item/projectile/P)
var/reflectchance = 70 - round(P.damage)
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))
@@ -1,2 +1,2 @@
/obj/item/weapon/rig/ert/janitor
/obj/item/weapon/rig/ert/janitor
req_access = null
@@ -1,72 +1,72 @@
/obj/item/weapon/rig/ch/precursor
name = "xenotech hardsuit control module"
desc = "A purple hardsuit gleaming with energy and alien metals."
suit_type = "precursor hardsuit"
icon = 'modular_chomp/icons/obj/rig_modules_ch.dmi'
icon_state = "precursor_rig"
armor = list(melee = 50, bullet = 50, laser = 70, energy = 70, bomb = 60, bio = 100, rad = 80)
matter = list(MAT_PLASTEEL = 1200, MAT_GOLD = 500, MAT_GRAPHITE = 800, MAT_OSMIUM = 300, MAT_PLASTIC = 600, MAT_VERDANTIUM = 750, MAT_MORPHIUM = 2000)
var/block_chance = 15
slowdown = 0
chest_type = /obj/item/clothing/suit/space/rig/ch/precursor
helm_type = /obj/item/clothing/head/helmet/space/rig/ch/precursor
glove_type = /obj/item/clothing/gloves/gauntlets/rig/ch/precursor
boot_type = /obj/item/clothing/shoes/magboots/rig/ch/precursor
req_access = list()
req_one_access = list()
/obj/item/clothing/suit/space/rig/ch/precursor
name = "protective vest"
icon = 'icons/obj/clothing/spacesuits_ch.dmi'
desc = "Light weight but oddly protective plating."
var/block_chance = 15
/obj/item/clothing/head/helmet/space/rig/ch/precursor
name = "helmet"
icon = 'icons/obj/clothing/hats_ch.dmi'
desc = "A protective dome for your head."
var/block_chance = 15
/obj/item/clothing/gloves/gauntlets/rig/ch/precursor
name = "gloves"
icon = 'icons/obj/clothing/gloves_ch.dmi'
desc = "Gloves created with alien tech"
var/block_chance = 15
/obj/item/clothing/shoes/magboots/rig/ch/precursor
name = "boots"
icon = 'icons/obj/clothing/shoes_ch.dmi'
desc = "A pair of grabby boots"
var/block_chance = 15
/obj/item/weapon/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
return FALSE
/obj/item/clothing/suit/space/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
return FALSE
/obj/item/clothing/head/helmet/space/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
return FALSE
/obj/item/clothing/gloves/gauntlets/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
return FALSE
/obj/item/clothing/shoes/magboots/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
/obj/item/weapon/rig/ch/precursor
name = "xenotech hardsuit control module"
desc = "A purple hardsuit gleaming with energy and alien metals."
suit_type = "precursor hardsuit"
icon = 'modular_chomp/icons/obj/rig_modules_ch.dmi'
icon_state = "precursor_rig"
armor = list(melee = 50, bullet = 50, laser = 70, energy = 70, bomb = 60, bio = 100, rad = 80)
matter = list(MAT_PLASTEEL = 1200, MAT_GOLD = 500, MAT_GRAPHITE = 800, MAT_OSMIUM = 300, MAT_PLASTIC = 600, MAT_VERDANTIUM = 750, MAT_MORPHIUM = 2000)
var/block_chance = 15
slowdown = 0
chest_type = /obj/item/clothing/suit/space/rig/ch/precursor
helm_type = /obj/item/clothing/head/helmet/space/rig/ch/precursor
glove_type = /obj/item/clothing/gloves/gauntlets/rig/ch/precursor
boot_type = /obj/item/clothing/shoes/magboots/rig/ch/precursor
req_access = list()
req_one_access = list()
/obj/item/clothing/suit/space/rig/ch/precursor
name = "protective vest"
icon = 'icons/obj/clothing/spacesuits_ch.dmi'
desc = "Light weight but oddly protective plating."
var/block_chance = 15
/obj/item/clothing/head/helmet/space/rig/ch/precursor
name = "helmet"
icon = 'icons/obj/clothing/hats_ch.dmi'
desc = "A protective dome for your head."
var/block_chance = 15
/obj/item/clothing/gloves/gauntlets/rig/ch/precursor
name = "gloves"
icon = 'icons/obj/clothing/gloves_ch.dmi'
desc = "Gloves created with alien tech"
var/block_chance = 15
/obj/item/clothing/shoes/magboots/rig/ch/precursor
name = "boots"
icon = 'icons/obj/clothing/shoes_ch.dmi'
desc = "A pair of grabby boots"
var/block_chance = 15
/obj/item/weapon/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
return FALSE
/obj/item/clothing/suit/space/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
return FALSE
/obj/item/clothing/head/helmet/space/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
return FALSE
/obj/item/clothing/gloves/gauntlets/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
return FALSE
/obj/item/clothing/shoes/magboots/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
return FALSE
@@ -1,97 +1,97 @@
#define LOC_RIOT 0
#define LOC_ATMOS 1
#define LOC_DISPOSAL 2
#define LOC_TECH 3
#define LOC_VAULT 4
#define DANGER_CRAB 0
#define DANGER_ICE 1
#define DANGER_RAY 2
//infestation event of a diffrent variety
//meant for engineering and science to exploit
/datum/event/dangerinfestation
announceWhen = 10
endWhen = 11
var/location
var/locstring
var/danger
var/dangerstring
/datum/event/dangerinfestation/start()
location = rand(0,4)
var/list/turf/simulated/floor/turfs = list()
var/spawn_area_type
switch(location)
if(LOC_RIOT)
spawn_area_type = /area/security/riot_control
locstring = "riot control"
if(LOC_ATMOS)
spawn_area_type = /area/engineering/atmos
locstring = "atmospherics"
if(LOC_DISPOSAL)
spawn_area_type = /area/maintenance/disposal
locstring = "the disposal"
if(LOC_TECH)
spawn_area_type = /area/storage/tech
locstring = "technical storage"
if(LOC_VAULT)
spawn_area_type = /area/security/nuke_storage
locstring = "the vault"
for(var/areapath in typesof(spawn_area_type))
var/area/A = locate(areapath)
for(var/turf/simulated/floor/F in A.contents)
//VOREStation Edit - Fixes event
var/blocked = FALSE
for(var/atom/movable/AM in F)
if(AM.density)
blocked = TRUE
if(!blocked)
turfs += F
var/list/spawn_types = list()
var/min_number
var/max_number
danger = rand(0,2)
switch(danger)
if(DANGER_CRAB)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/radcrab)
min_number = 1
max_number = 4
dangerstring = "crystaline crabs"
if(DANGER_ICE)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/livingice)
min_number = 1
max_number = 4
dangerstring = "strange entities"
if(DANGER_RAY)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/solarray)
min_number = 1
max_number = 4
dangerstring = "solar rays"
spawn(0)
var/num = rand(min_number,max_number)
while(turfs.len > 0 && num > 0)
var/turf/simulated/floor/T = pick(turfs)
turfs.Remove(T)
num--
var/spawn_type = pick(spawn_types)
new spawn_type(T)
/datum/event/dangerinfestation/announce()
command_announcement.Announce("Bioscans indicate that [dangerstring] have been entered [locstring]. Contain them before they start causing damage.", "Alien infestation")
#undef LOC_RIOT
#undef LOC_ATMOS
#undef LOC_DISPOSAL
#undef LOC_TECH
#undef LOC_VAULT
#undef DANGER_CRAB
#undef DANGER_ICE
#define LOC_RIOT 0
#define LOC_ATMOS 1
#define LOC_DISPOSAL 2
#define LOC_TECH 3
#define LOC_VAULT 4
#define DANGER_CRAB 0
#define DANGER_ICE 1
#define DANGER_RAY 2
//infestation event of a diffrent variety
//meant for engineering and science to exploit
/datum/event/dangerinfestation
announceWhen = 10
endWhen = 11
var/location
var/locstring
var/danger
var/dangerstring
/datum/event/dangerinfestation/start()
location = rand(0,4)
var/list/turf/simulated/floor/turfs = list()
var/spawn_area_type
switch(location)
if(LOC_RIOT)
spawn_area_type = /area/security/riot_control
locstring = "riot control"
if(LOC_ATMOS)
spawn_area_type = /area/engineering/atmos
locstring = "atmospherics"
if(LOC_DISPOSAL)
spawn_area_type = /area/maintenance/disposal
locstring = "the disposal"
if(LOC_TECH)
spawn_area_type = /area/storage/tech
locstring = "technical storage"
if(LOC_VAULT)
spawn_area_type = /area/security/nuke_storage
locstring = "the vault"
for(var/areapath in typesof(spawn_area_type))
var/area/A = locate(areapath)
for(var/turf/simulated/floor/F in A.contents)
//VOREStation Edit - Fixes event
var/blocked = FALSE
for(var/atom/movable/AM in F)
if(AM.density)
blocked = TRUE
if(!blocked)
turfs += F
var/list/spawn_types = list()
var/min_number
var/max_number
danger = rand(0,2)
switch(danger)
if(DANGER_CRAB)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/radcrab)
min_number = 1
max_number = 4
dangerstring = "crystaline crabs"
if(DANGER_ICE)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/livingice)
min_number = 1
max_number = 4
dangerstring = "strange entities"
if(DANGER_RAY)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/solarray)
min_number = 1
max_number = 4
dangerstring = "solar rays"
spawn(0)
var/num = rand(min_number,max_number)
while(turfs.len > 0 && num > 0)
var/turf/simulated/floor/T = pick(turfs)
turfs.Remove(T)
num--
var/spawn_type = pick(spawn_types)
new spawn_type(T)
/datum/event/dangerinfestation/announce()
command_announcement.Announce("Bioscans indicate that [dangerstring] have been entered [locstring]. Contain them before they start causing damage.", "Alien infestation")
#undef LOC_RIOT
#undef LOC_ATMOS
#undef LOC_DISPOSAL
#undef LOC_TECH
#undef LOC_VAULT
#undef DANGER_CRAB
#undef DANGER_ICE
#undef DANGER_RAY
@@ -1,124 +1,124 @@
#define LOC_RIOT 0
#define LOC_ATMOS 1
#define LOC_DISPOSAL 2
#define LOC_TECH 3
#define LOC_VAULT 4
#define LOC_VIRO 5
#define LOC_BRIDGE 6
#define LOC_BRIG 7
#define DANGER_CRAB 0
#define DANGER_ICE 1
#define DANGER_RAY 2
#define DANGER_EEL 3
#define DANGER_TURTLE 4
//infestation event of a diffrent variety
//meant for engineering and science to exploit
/datum/event/highdangerinfestation
announceWhen = 10
endWhen = 11
var/location
var/locstring
var/danger
var/dangerstring
/datum/event/highdangerinfestation/start()
location = rand(0,7)
var/list/turf/simulated/floor/turfs = list()
var/spawn_area_type
switch(location)
if(LOC_RIOT)
spawn_area_type = /area/security/riot_control
locstring = "riot control"
if(LOC_ATMOS)
spawn_area_type = /area/engineering/atmos
locstring = "atmospherics"
if(LOC_DISPOSAL)
spawn_area_type = /area/maintenance/disposal
locstring = "the disposal"
if(LOC_TECH)
spawn_area_type = /area/storage/tech
locstring = "technical storage"
if(LOC_VAULT)
spawn_area_type = /area/security/nuke_storage
locstring = "the vault"
if(LOC_VIRO)
spawn_area_type = /area/medical/virology
locstring = "the virogoly"
if(LOC_BRIDGE)
spawn_area_type = /area/bridge
locstring = "the bridge"
if(LOC_BRIG)
spawn_area_type = /area/security/prison
locstring = "the brig"
for(var/areapath in typesof(spawn_area_type))
var/area/A = locate(areapath)
for(var/turf/simulated/floor/F in A.contents)
//VOREStation Edit - Fixes event
var/blocked = FALSE
for(var/atom/movable/AM in F)
if(AM.density)
blocked = TRUE
if(!blocked)
turfs += F
var/list/spawn_types = list()
var/min_number
var/max_number
danger = rand(0,4)
switch(danger)
if(DANGER_CRAB)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/radcrab)
min_number = 2
max_number = 6
dangerstring = "crystaline crabs"
if(DANGER_ICE)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/livingice)
min_number = 2
max_number = 6
dangerstring = "strange entities"
if(DANGER_RAY)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/solarray)
min_number = 2
max_number = 6
dangerstring = "solar rays"
if(DANGER_EEL)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/dreameel)
min_number = 2
max_number = 6
dangerstring = "strange entities"
if(DANGER_TURTLE)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/gravityshell)
min_number = 2
max_number = 6
dangerstring = "strange entities"
spawn(0)
var/num = rand(min_number,max_number)
while(turfs.len > 0 && num > 0)
var/turf/simulated/floor/T = pick(turfs)
turfs.Remove(T)
num--
var/spawn_type = pick(spawn_types)
new spawn_type(T)
/datum/event/highdangerinfestation/announce()
command_announcement.Announce("Bioscans indicate that [dangerstring] have been entered [locstring]. Contain them before they start causing damage.", "Alien infestation")
#undef LOC_RIOT
#undef LOC_ATMOS
#undef LOC_DISPOSAL
#undef LOC_TECH
#undef LOC_VAULT
#undef LOC_VIRO
#undef LOC_BRIDGE
#undef LOC_BRIG
#undef DANGER_CRAB
#undef DANGER_ICE
#undef DANGER_RAY
#undef DANGER_EEL
#define LOC_RIOT 0
#define LOC_ATMOS 1
#define LOC_DISPOSAL 2
#define LOC_TECH 3
#define LOC_VAULT 4
#define LOC_VIRO 5
#define LOC_BRIDGE 6
#define LOC_BRIG 7
#define DANGER_CRAB 0
#define DANGER_ICE 1
#define DANGER_RAY 2
#define DANGER_EEL 3
#define DANGER_TURTLE 4
//infestation event of a diffrent variety
//meant for engineering and science to exploit
/datum/event/highdangerinfestation
announceWhen = 10
endWhen = 11
var/location
var/locstring
var/danger
var/dangerstring
/datum/event/highdangerinfestation/start()
location = rand(0,7)
var/list/turf/simulated/floor/turfs = list()
var/spawn_area_type
switch(location)
if(LOC_RIOT)
spawn_area_type = /area/security/riot_control
locstring = "riot control"
if(LOC_ATMOS)
spawn_area_type = /area/engineering/atmos
locstring = "atmospherics"
if(LOC_DISPOSAL)
spawn_area_type = /area/maintenance/disposal
locstring = "the disposal"
if(LOC_TECH)
spawn_area_type = /area/storage/tech
locstring = "technical storage"
if(LOC_VAULT)
spawn_area_type = /area/security/nuke_storage
locstring = "the vault"
if(LOC_VIRO)
spawn_area_type = /area/medical/virology
locstring = "the virogoly"
if(LOC_BRIDGE)
spawn_area_type = /area/bridge
locstring = "the bridge"
if(LOC_BRIG)
spawn_area_type = /area/security/prison
locstring = "the brig"
for(var/areapath in typesof(spawn_area_type))
var/area/A = locate(areapath)
for(var/turf/simulated/floor/F in A.contents)
//VOREStation Edit - Fixes event
var/blocked = FALSE
for(var/atom/movable/AM in F)
if(AM.density)
blocked = TRUE
if(!blocked)
turfs += F
var/list/spawn_types = list()
var/min_number
var/max_number
danger = rand(0,4)
switch(danger)
if(DANGER_CRAB)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/radcrab)
min_number = 2
max_number = 6
dangerstring = "crystaline crabs"
if(DANGER_ICE)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/livingice)
min_number = 2
max_number = 6
dangerstring = "strange entities"
if(DANGER_RAY)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/solarray)
min_number = 2
max_number = 6
dangerstring = "solar rays"
if(DANGER_EEL)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/dreameel)
min_number = 2
max_number = 6
dangerstring = "strange entities"
if(DANGER_TURTLE)
spawn_types = list(/mob/living/simple_mob/vore/spacecritter/gravityshell)
min_number = 2
max_number = 6
dangerstring = "strange entities"
spawn(0)
var/num = rand(min_number,max_number)
while(turfs.len > 0 && num > 0)
var/turf/simulated/floor/T = pick(turfs)
turfs.Remove(T)
num--
var/spawn_type = pick(spawn_types)
new spawn_type(T)
/datum/event/highdangerinfestation/announce()
command_announcement.Announce("Bioscans indicate that [dangerstring] have been entered [locstring]. Contain them before they start causing damage.", "Alien infestation")
#undef LOC_RIOT
#undef LOC_ATMOS
#undef LOC_DISPOSAL
#undef LOC_TECH
#undef LOC_VAULT
#undef LOC_VIRO
#undef LOC_BRIDGE
#undef LOC_BRIG
#undef DANGER_CRAB
#undef DANGER_ICE
#undef DANGER_RAY
#undef DANGER_EEL
#undef DANGER_TURTLE
+286 -286
View File
@@ -1,286 +1,286 @@
/obj/structure/closet/crate/secure/lootsafe
name = "secure safe"
desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Scarborough Arms - 2 tumbler safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\""
icon = 'icons/obj/structures.dmi' //I should coder sprite something but for now using normal safe
icon_state = "safe"
anchored = TRUE
density = TRUE
health = 500 //Cause in heavy defended areas and thermite resistaint
locked = 1
var/hackguard = 10
/obj/structure/closet/crate/secure/lootsafe/emag_act(var/remaining_charges, var/mob/user)
if (locked)
if(prob(60 - hackguard))
to_chat(user, "<span class='notice'>The safe unlocks!</span>")
locked = 0
return 1
if(prob(15 + hackguard))
to_chat(user, "<span class='notice'>The safe buzzes as a security drone is teleported in!</span>")
new /mob/living/simple_mob/mechanical/combat_drone (src.loc) //if I ever make security stun drones remind me to replace this with those
//new /effect/system/spark_spread (src.loc) I am to tired to make this work right now
return 1
else
to_chat(user, "<span class='notice'>The safe buzzes but the security systems don't trigger.</span>")
return 1
//Loot for lootsafes
/obj/structure/closet/crate/secure/lootsafe/proc/generate_loot()
var/lootvalue = 0
while(lootvalue <= 15) //if the initial generation gives you less than 10 points of stuff, add more stuff
//pick a thing to add to the crate - the format is "list(filepath, value) = weight,"
var/choice = list()
choice = pickweight(list(
list(/obj/item/weapon/spacecash/c500, 3) = 5,
list(/obj/item/weapon/spacecash/c200, 3) = 5,
list(/obj/item/weapon/spacecash/c100, 3) = 5,
list(/obj/item/weapon/spacecash/c50, 3) = 5,
list(/obj/item/weapon/spacecash/c20, 3) = 5,
list(pick(/obj/item/device/multitool/alien,
/obj/item/stack/cable_coil/alien,
/obj/item/weapon/tool/crowbar/alien,
/obj/item/weapon/tool/screwdriver/alien,
/obj/item/weapon/weldingtool/alien,
/obj/item/weapon/tool/wirecutters/alien,
/obj/item/weapon/tool/wrench/alien), 3) = 10,
list(/obj/item/seeds/random, 3) = 10,
list(pick(subtypesof(/obj/item/weapon/storage/firstaid)), 3) = 15,
list(/obj/item/weapon/grenade/flashbang/clusterbang, 3) = 10,
list(pick(subtypesof(/obj/item/weapon/stock_parts) - /obj/item/weapon/stock_parts/subspace), 3) = 5,
list(/obj/item/weapon/rig/ch/precursor, 3) = 5,
list(/obj/item/weapon/rig/combat, 3) = 15,
list(/obj/item/weapon/rig/merc, 3) = 10,
list(/obj/item/weapon/rig/internalaffairs, 3) = 10,
list(/obj/item/weapon/rig/baymed, 3) = 10,
list(/obj/item/weapon/gun/energy/vepr/plasma, 3) = 5,
list(/obj/item/weapon/gun/energy/laser/vepr, 3) = 5,
list(/obj/item/weapon/gun/projectile/automatic/l6_saw, 3) = 10,
list(/obj/item/weapon/gun/projectile/automatic/tommygun, 3) = 10,
list(/obj/item/weapon/holosign_creator/combifan, 3) = 15,
list(/obj/item/weapon/rcd, 3) = 15,
list(/obj/item/weapon/gun/energy/medigun, 3) = 10,
list(/obj/item/weapon/gun/energy/sickshot, 3) = 5,
list(/obj/item/slime_extract/purple, 3) = 10,
list(/obj/item/slime_extract/bluespace, 3) = 10,
list(/obj/item/slime_extract/blue, 3) = 10,
list(/obj/item/slime_extract/red, 3) = 10,
list(/obj/item/slime_extract/emerald, 3) = 10,
list(/obj/item/slime_extract/cerulean, 3) = 10,
list(/obj/item/slime_extract/ruby, 3) = 10,
list(/obj/item/slime_extract/green, 3) = 10,
list(/obj/item/slime_extract/pink, 3) = 10,
list(/obj/item/slime_extract/oil, 3) = 10,
list(/obj/item/slime_extract/dark_blue, 3) = 10,
list(/obj/item/slime_extract/dark_purple, 3) = 10,
list(/obj/item/clothing/glasses/omni, 3) = 10,
list(/obj/item/clothing/glasses/thermal, 3) = 10,
list(/obj/item/clothing/glasses/night, 3) = 15,
list(/obj/item/stack/material/void_opal, 3) = 5,
list(/obj/item/weapon/inducer/syndicate, 3) = 10,
list(/obj/item/weapon/melee/energy/axe, 3) = 10,
list(/obj/item/rig_module/chem_dispenser/ninja, 3) = 10,
list(/obj/item/rig_module/vision/multi, 3) = 5,
list(/obj/item/rig_module/mounted/energy_blade, 3) = 5,
list(/obj/item/device/perfect_tele, 3) = 15
))
var/path = choice[1]
var/value = choice[2]
contents += new path()
lootvalue += value
/obj/structure/closet/crate/secure/lootsafe/numberlock
desc = "A huge chunk of metal with a keypad embedded in it. Fine print above the keypad reads, Guaranteed thermite resistant, explosion resistant, and assistant resistant.\""
var/list/code = list()
var/list/lastattempt = list()
var/attempts = 10
var/codelen = 5
/obj/structure/closet/crate/secure/lootsafe/numberlock/extraguard
hackguard = 20
/obj/structure/closet/crate/secure/lootsafe/numberlock/weak
hackguard = 5
codelen = 3
/obj/structure/closet/crate/secure/lootsafe/numberlock/New()
..()
var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
for(var/i in 1 to codelen)
code += pick(digits)
digits -= code[code.len]
generate_loot()
/obj/structure/closet/crate/secure/lootsafe/numberlock/togglelock(mob/user as mob)
if(!locked)
return
to_chat(user, "<span class='notice'>The crate is locked with a Deca-code lock.</span>")
var/input = tgui_input_text(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "")
if(!Adjacent(user))
return
var/list/sanitised = list()
var/sanitycheck = 1
for(var/i=1,i<=length(input),i++) //put the guess into a list
sanitised += text2num(copytext(input,i,i+1))
for(var/i=1,i<=(length(input)-1),i++) //compare each digit in the guess to all those following it
for(var/j=(i+1),j<=length(input),j++)
if(sanitised[i] == sanitised[j])
sanitycheck = null //if a digit is repeated, reject the input
if(input == null || sanitycheck == null || length(input) != codelen)
to_chat(user, "<span class='notice'>You leave the crate alone.</span>")
else if(check_input(input))
to_chat(user, "<span class='notice'>The crate unlocks!</span>")
playsound(src, 'sound/machines/lockreset.ogg', 50, 1)
set_locked(0)
else
visible_message("<span class='warning'>A red light on \the [src]'s control panel flashes briefly.</span>")
attempts--
if (attempts == 0)
to_chat(user, "<span class='danger'>The crate's anti-tamper system activates!</span>")
var/turf/T = get_turf(src.loc)
explosion(T, 0, 0, 1, 2)
qdel(src)
/obj/structure/closet/crate/secure/lootsafe/numberlock/proc/check_input(var/input)
if(length(input) != codelen)
return 0
. = 1
lastattempt.Cut()
for(var/i in 1 to codelen)
var/guesschar = copytext(input, i, i+1)
lastattempt += guesschar
if(guesschar != code[i])
. = 0
/obj/structure/closet/crate/secure/lootsafe/numberlock/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(locked)
if (istype(W, /obj/item/device/multitool)) // Greetings Urist McProfessor, how about a nice game of cows and bulls?
to_chat(user, "<span class='notice'>DECA-CODE LOCK ANALYSIS:</span>")
if (attempts == 1)
to_chat(user, "<span class='warning'>* Anti-Tamper system will activate on the next failed access attempt.</span>")
else
to_chat(user, "<span class='notice'>* Anti-Tamper system will activate after [src.attempts] failed access attempts.</span>")
if(lastattempt.len)
var/bulls = 0
var/cows = 0
var/list/code_contents = code.Copy()
for(var/i in 1 to codelen)
if(lastattempt[i] == code[i])
++bulls
else if(lastattempt[i] in code_contents)
++cows
code_contents -= lastattempt[i]
var/previousattempt = null //convert back to string for readback
for(var/i in 1 to codelen)
previousattempt = addtext(previousattempt, lastattempt[i])
to_chat(user, "<span class='notice'>Last code attempt, [previousattempt], had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.</span>")
return
..()
//Currently Admeme things but due to chatter I have ideas on how to expand this later
//Concept is you either A) go and get the keycard, or B) brute force.
/obj/structure/closet/crate/secure/lootsafe/devillock
desc = "A huge chunk of metal with a keyboard imprinted in it.\""
hackguard = 45
req_access = list(150)
var/list/code = list()
var/list/lastattempt = list()
var/attempts = 100
var/codelen = 10
/obj/item/weapon/card/id/bosskey
name = "Strange ID"
desc = "A golden card which seems unnatural in nature."
icon_state = "gold-id"
item_state = "gold_id"
access = list(150)
/obj/structure/closet/crate/secure/lootsafe/devillock/New()
..()
var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")
for(var/i in 1 to codelen)
code += pick(digits)
digits -= code[code.len]
generate_loot()
/obj/structure/closet/crate/secure/lootsafe/devillock/togglelock(mob/user as mob)
if(!locked)
return
to_chat(user, "<span class='notice'>The crate is locked with a Deca-code lock.</span>")
var/input = tgui_input_text(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "")
if(!Adjacent(user))
return
var/list/sanitised = list()
var/sanitycheck = 1
for(var/i=1,i<=length(input),i++) //put the guess into a list
sanitised += text2num(copytext(input,i,i+1))
for(var/i=1,i<=(length(input)-1),i++) //compare each digit in the guess to all those following it
for(var/j=(i+1),j<=length(input),j++)
if(sanitised[i] == sanitised[j])
sanitycheck = null //if a digit is repeated, reject the input
if(input == null || sanitycheck == null || length(input) != codelen)
to_chat(user, "<span class='notice'>You leave the crate alone.</span>")
else if(check_input(input))
to_chat(user, "<span class='notice'>The crate unlocks!</span>")
playsound(src, 'sound/machines/lockreset.ogg', 50, 1)
set_locked(0)
else
visible_message("<span class='warning'>A red light on \the [src]'s control panel flashes briefly.</span>")
attempts--
if (attempts == 0)
to_chat(user, "<span class='danger'>The crate's anti-tamper system activates!</span>")
var/turf/T = get_turf(src.loc)
explosion(T, 0, 0, 1, 2)
qdel(src)
/obj/structure/closet/crate/secure/lootsafe/devillock/proc/check_input(var/input)
if(length(input) != codelen)
return 0
. = 1
lastattempt.Cut()
for(var/i in 1 to codelen)
var/guesschar = copytext(input, i, i+1)
lastattempt += guesschar
if(guesschar != code[i])
. = 0
/obj/structure/closet/crate/secure/lootsafe/devillock/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(locked)
if (istype(W, /obj/item/device/multitool)) // Greetings Urist McProfessor, how about a nice game of cows and bulls?
to_chat(user, "<span class='notice'>DECA-CODE LOCK ANALYSIS:</span>")
if (attempts == 1)
to_chat(user, "<span class='warning'>* Anti-Tamper system will activate on the next failed access attempt.</span>")
else
to_chat(user, "<span class='notice'>* Anti-Tamper system will activate after [src.attempts] failed access attempts.</span>")
if(lastattempt.len)
var/bulls = 0
var/cows = 0
var/list/code_contents = code.Copy()
for(var/i in 1 to codelen)
if(lastattempt[i] == code[i])
++bulls
else if(lastattempt[i] in code_contents)
++cows
code_contents -= lastattempt[i]
var/previousattempt = null //convert back to string for readback
for(var/i in 1 to codelen)
previousattempt = addtext(previousattempt, lastattempt[i])
to_chat(user, "<span class='notice'>Last code attempt, [previousattempt], had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.</span>")
return
..()
/obj/structure/closet/crate/secure/lootsafe
name = "secure safe"
desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Scarborough Arms - 2 tumbler safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\""
icon = 'icons/obj/structures.dmi' //I should coder sprite something but for now using normal safe
icon_state = "safe"
anchored = TRUE
density = TRUE
health = 500 //Cause in heavy defended areas and thermite resistaint
locked = 1
var/hackguard = 10
/obj/structure/closet/crate/secure/lootsafe/emag_act(var/remaining_charges, var/mob/user)
if (locked)
if(prob(60 - hackguard))
to_chat(user, "<span class='notice'>The safe unlocks!</span>")
locked = 0
return 1
if(prob(15 + hackguard))
to_chat(user, "<span class='notice'>The safe buzzes as a security drone is teleported in!</span>")
new /mob/living/simple_mob/mechanical/combat_drone (src.loc) //if I ever make security stun drones remind me to replace this with those
//new /effect/system/spark_spread (src.loc) I am to tired to make this work right now
return 1
else
to_chat(user, "<span class='notice'>The safe buzzes but the security systems don't trigger.</span>")
return 1
//Loot for lootsafes
/obj/structure/closet/crate/secure/lootsafe/proc/generate_loot()
var/lootvalue = 0
while(lootvalue <= 15) //if the initial generation gives you less than 10 points of stuff, add more stuff
//pick a thing to add to the crate - the format is "list(filepath, value) = weight,"
var/choice = list()
choice = pickweight(list(
list(/obj/item/weapon/spacecash/c500, 3) = 5,
list(/obj/item/weapon/spacecash/c200, 3) = 5,
list(/obj/item/weapon/spacecash/c100, 3) = 5,
list(/obj/item/weapon/spacecash/c50, 3) = 5,
list(/obj/item/weapon/spacecash/c20, 3) = 5,
list(pick(/obj/item/device/multitool/alien,
/obj/item/stack/cable_coil/alien,
/obj/item/weapon/tool/crowbar/alien,
/obj/item/weapon/tool/screwdriver/alien,
/obj/item/weapon/weldingtool/alien,
/obj/item/weapon/tool/wirecutters/alien,
/obj/item/weapon/tool/wrench/alien), 3) = 10,
list(/obj/item/seeds/random, 3) = 10,
list(pick(subtypesof(/obj/item/weapon/storage/firstaid)), 3) = 15,
list(/obj/item/weapon/grenade/flashbang/clusterbang, 3) = 10,
list(pick(subtypesof(/obj/item/weapon/stock_parts) - /obj/item/weapon/stock_parts/subspace), 3) = 5,
list(/obj/item/weapon/rig/ch/precursor, 3) = 5,
list(/obj/item/weapon/rig/combat, 3) = 15,
list(/obj/item/weapon/rig/merc, 3) = 10,
list(/obj/item/weapon/rig/internalaffairs, 3) = 10,
list(/obj/item/weapon/rig/baymed, 3) = 10,
list(/obj/item/weapon/gun/energy/vepr/plasma, 3) = 5,
list(/obj/item/weapon/gun/energy/laser/vepr, 3) = 5,
list(/obj/item/weapon/gun/projectile/automatic/l6_saw, 3) = 10,
list(/obj/item/weapon/gun/projectile/automatic/tommygun, 3) = 10,
list(/obj/item/weapon/holosign_creator/combifan, 3) = 15,
list(/obj/item/weapon/rcd, 3) = 15,
list(/obj/item/weapon/gun/energy/medigun, 3) = 10,
list(/obj/item/weapon/gun/energy/sickshot, 3) = 5,
list(/obj/item/slime_extract/purple, 3) = 10,
list(/obj/item/slime_extract/bluespace, 3) = 10,
list(/obj/item/slime_extract/blue, 3) = 10,
list(/obj/item/slime_extract/red, 3) = 10,
list(/obj/item/slime_extract/emerald, 3) = 10,
list(/obj/item/slime_extract/cerulean, 3) = 10,
list(/obj/item/slime_extract/ruby, 3) = 10,
list(/obj/item/slime_extract/green, 3) = 10,
list(/obj/item/slime_extract/pink, 3) = 10,
list(/obj/item/slime_extract/oil, 3) = 10,
list(/obj/item/slime_extract/dark_blue, 3) = 10,
list(/obj/item/slime_extract/dark_purple, 3) = 10,
list(/obj/item/clothing/glasses/omni, 3) = 10,
list(/obj/item/clothing/glasses/thermal, 3) = 10,
list(/obj/item/clothing/glasses/night, 3) = 15,
list(/obj/item/stack/material/void_opal, 3) = 5,
list(/obj/item/weapon/inducer/syndicate, 3) = 10,
list(/obj/item/weapon/melee/energy/axe, 3) = 10,
list(/obj/item/rig_module/chem_dispenser/ninja, 3) = 10,
list(/obj/item/rig_module/vision/multi, 3) = 5,
list(/obj/item/rig_module/mounted/energy_blade, 3) = 5,
list(/obj/item/device/perfect_tele, 3) = 15
))
var/path = choice[1]
var/value = choice[2]
contents += new path()
lootvalue += value
/obj/structure/closet/crate/secure/lootsafe/numberlock
desc = "A huge chunk of metal with a keypad embedded in it. Fine print above the keypad reads, Guaranteed thermite resistant, explosion resistant, and assistant resistant.\""
var/list/code = list()
var/list/lastattempt = list()
var/attempts = 10
var/codelen = 5
/obj/structure/closet/crate/secure/lootsafe/numberlock/extraguard
hackguard = 20
/obj/structure/closet/crate/secure/lootsafe/numberlock/weak
hackguard = 5
codelen = 3
/obj/structure/closet/crate/secure/lootsafe/numberlock/New()
..()
var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
for(var/i in 1 to codelen)
code += pick(digits)
digits -= code[code.len]
generate_loot()
/obj/structure/closet/crate/secure/lootsafe/numberlock/togglelock(mob/user as mob)
if(!locked)
return
to_chat(user, "<span class='notice'>The crate is locked with a Deca-code lock.</span>")
var/input = tgui_input_text(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "")
if(!Adjacent(user))
return
var/list/sanitised = list()
var/sanitycheck = 1
for(var/i=1,i<=length(input),i++) //put the guess into a list
sanitised += text2num(copytext(input,i,i+1))
for(var/i=1,i<=(length(input)-1),i++) //compare each digit in the guess to all those following it
for(var/j=(i+1),j<=length(input),j++)
if(sanitised[i] == sanitised[j])
sanitycheck = null //if a digit is repeated, reject the input
if(input == null || sanitycheck == null || length(input) != codelen)
to_chat(user, "<span class='notice'>You leave the crate alone.</span>")
else if(check_input(input))
to_chat(user, "<span class='notice'>The crate unlocks!</span>")
playsound(src, 'sound/machines/lockreset.ogg', 50, 1)
set_locked(0)
else
visible_message("<span class='warning'>A red light on \the [src]'s control panel flashes briefly.</span>")
attempts--
if (attempts == 0)
to_chat(user, "<span class='danger'>The crate's anti-tamper system activates!</span>")
var/turf/T = get_turf(src.loc)
explosion(T, 0, 0, 1, 2)
qdel(src)
/obj/structure/closet/crate/secure/lootsafe/numberlock/proc/check_input(var/input)
if(length(input) != codelen)
return 0
. = 1
lastattempt.Cut()
for(var/i in 1 to codelen)
var/guesschar = copytext(input, i, i+1)
lastattempt += guesschar
if(guesschar != code[i])
. = 0
/obj/structure/closet/crate/secure/lootsafe/numberlock/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(locked)
if (istype(W, /obj/item/device/multitool)) // Greetings Urist McProfessor, how about a nice game of cows and bulls?
to_chat(user, "<span class='notice'>DECA-CODE LOCK ANALYSIS:</span>")
if (attempts == 1)
to_chat(user, "<span class='warning'>* Anti-Tamper system will activate on the next failed access attempt.</span>")
else
to_chat(user, "<span class='notice'>* Anti-Tamper system will activate after [src.attempts] failed access attempts.</span>")
if(lastattempt.len)
var/bulls = 0
var/cows = 0
var/list/code_contents = code.Copy()
for(var/i in 1 to codelen)
if(lastattempt[i] == code[i])
++bulls
else if(lastattempt[i] in code_contents)
++cows
code_contents -= lastattempt[i]
var/previousattempt = null //convert back to string for readback
for(var/i in 1 to codelen)
previousattempt = addtext(previousattempt, lastattempt[i])
to_chat(user, "<span class='notice'>Last code attempt, [previousattempt], had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.</span>")
return
..()
//Currently Admeme things but due to chatter I have ideas on how to expand this later
//Concept is you either A) go and get the keycard, or B) brute force.
/obj/structure/closet/crate/secure/lootsafe/devillock
desc = "A huge chunk of metal with a keyboard imprinted in it.\""
hackguard = 45
req_access = list(150)
var/list/code = list()
var/list/lastattempt = list()
var/attempts = 100
var/codelen = 10
/obj/item/weapon/card/id/bosskey
name = "Strange ID"
desc = "A golden card which seems unnatural in nature."
icon_state = "gold-id"
item_state = "gold_id"
access = list(150)
/obj/structure/closet/crate/secure/lootsafe/devillock/New()
..()
var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")
for(var/i in 1 to codelen)
code += pick(digits)
digits -= code[code.len]
generate_loot()
/obj/structure/closet/crate/secure/lootsafe/devillock/togglelock(mob/user as mob)
if(!locked)
return
to_chat(user, "<span class='notice'>The crate is locked with a Deca-code lock.</span>")
var/input = tgui_input_text(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "")
if(!Adjacent(user))
return
var/list/sanitised = list()
var/sanitycheck = 1
for(var/i=1,i<=length(input),i++) //put the guess into a list
sanitised += text2num(copytext(input,i,i+1))
for(var/i=1,i<=(length(input)-1),i++) //compare each digit in the guess to all those following it
for(var/j=(i+1),j<=length(input),j++)
if(sanitised[i] == sanitised[j])
sanitycheck = null //if a digit is repeated, reject the input
if(input == null || sanitycheck == null || length(input) != codelen)
to_chat(user, "<span class='notice'>You leave the crate alone.</span>")
else if(check_input(input))
to_chat(user, "<span class='notice'>The crate unlocks!</span>")
playsound(src, 'sound/machines/lockreset.ogg', 50, 1)
set_locked(0)
else
visible_message("<span class='warning'>A red light on \the [src]'s control panel flashes briefly.</span>")
attempts--
if (attempts == 0)
to_chat(user, "<span class='danger'>The crate's anti-tamper system activates!</span>")
var/turf/T = get_turf(src.loc)
explosion(T, 0, 0, 1, 2)
qdel(src)
/obj/structure/closet/crate/secure/lootsafe/devillock/proc/check_input(var/input)
if(length(input) != codelen)
return 0
. = 1
lastattempt.Cut()
for(var/i in 1 to codelen)
var/guesschar = copytext(input, i, i+1)
lastattempt += guesschar
if(guesschar != code[i])
. = 0
/obj/structure/closet/crate/secure/lootsafe/devillock/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(locked)
if (istype(W, /obj/item/device/multitool)) // Greetings Urist McProfessor, how about a nice game of cows and bulls?
to_chat(user, "<span class='notice'>DECA-CODE LOCK ANALYSIS:</span>")
if (attempts == 1)
to_chat(user, "<span class='warning'>* Anti-Tamper system will activate on the next failed access attempt.</span>")
else
to_chat(user, "<span class='notice'>* Anti-Tamper system will activate after [src.attempts] failed access attempts.</span>")
if(lastattempt.len)
var/bulls = 0
var/cows = 0
var/list/code_contents = code.Copy()
for(var/i in 1 to codelen)
if(lastattempt[i] == code[i])
++bulls
else if(lastattempt[i] in code_contents)
++cows
code_contents -= lastattempt[i]
var/previousattempt = null //convert back to string for readback
for(var/i in 1 to codelen)
previousattempt = addtext(previousattempt, lastattempt[i])
to_chat(user, "<span class='notice'>Last code attempt, [previousattempt], had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.</span>")
return
..()
@@ -1,296 +1,296 @@
//////////////////CHOMP//////////////////////////
/datum/reagent/ethanol/cloverclub
glass_icon_state = "cloverclub"
glass_icon_source = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/ethanol/spiderdrink
glass_icon_state = "glassofspiders"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/tea/minttea
glass_icon_state = "bigteacup"
/datum/reagent/drink/tea/lemontea
glass_icon_state = "bigteacup"
/datum/reagent/drink/tea/limetea
glass_icon_state = "bigteacup"
/datum/reagent/drink/tea/orangetea
glass_icon_state = "bigteacup"
/datum/reagent/drink/tea/berrytea
glass_icon_state = "bigteacup"
/datum/reagent/drink/tea/cherrytea
glass_icon_state = "bigteacup"
/datum/reagent/drink/tea/watermelontea
glass_icon_state = "bigteacup"
/datum/reagent/drink/bubbleteawatermelon
glass_icon_state = "bubbleteawatermelonglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=9)
/datum/reagent/drink/bubbleteastrawberry
glass_icon_state = "bubbleteastrawberryglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=9)
/datum/reagent/drink/bubbleteacherry
glass_icon_state = "bubbleteacherryglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=9)
/datum/reagent/drink/bubbleteacoffee
glass_icon_state = "bubbleteacoffeeglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=9)
/datum/reagent/drink/bubbleteabanana
glass_icon_state = "bubbleteabananaglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=9)
/datum/reagent/drink/tea/matcha_latte
glass_icon_state = "bigteacup"
/datum/reagent/drink/horchata
glass_icon_state = "horchata"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=7)
/datum/reagent/toxin/bluetrain
glass_icon_state = "bluetrain"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/lovepotion
glass_icon_state = "lovepotion"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/lowpower
glass_icon_state = "lowpower"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/coffee/jackbrew
glass_icon_state = "jackbrew"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/bookwyrm
glass_icon_state = "bookwyrm"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/highpower
glass_icon_state = "highpower"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/flapper
glass_icon_state = "flapper"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/toxin/oilslide
glass_icon_state = "oilslide"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/sitonmyface
glass_icon_state = "sitonmyface"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/hachi
glass_icon_state = "hachi"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/mojito
glass_icon_state = "mojito"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/slimedrink
glass_icon_state = "slimedrink"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/arachnidslammer
glass_icon_state = "arachnidslammer"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/pilk
glass_icon_state = "whiskeyglass"
//Visual Updates of existing drinks
/datum/reagent/ethanol/gintonic
glass_icon_state = "gintonicglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/coffee/kahlua
glass_icon_state = "kahluaglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/wine
glass_icon_state = "wineglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/cognac
glass_icon_state = "cognacglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/cuba_libre
glass_icon_state = "cubalibreglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/manly_dorf
glass_icon_state = "manlydorfglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/tequilla_sunrise
glass_icon_state = "tequilasunriseglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/screwdrivercocktail
glass_icon_state = "screwdriverglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/bloody_mary
glass_icon_state = "bloodymaryglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/coffee/brave_bull
glass_icon_state = "bravebullglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/doctor_delight
glass_icon_state = "doctorsdelightglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/soda/space_up
glass_icon_state = "space-up_glass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/vodkatonic
glass_icon_state = "vodkatonicglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/manhattan
glass_icon_state = "manhattanglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/manhattan_proj
glass_icon_state = "proj_manhattanglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/ginfizz
glass_icon_state = "ginfizzglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/longislandicedtea
glass_icon_state = "longislandicedteaglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/threemileisland
glass_icon_state = "threemileislandglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/margarita
glass_icon_state = "margaritaglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/soda/spacemountainwind
glass_icon_state = "Space_mountain_wind_glass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/thirteenloko
glass_icon_state = "thirteen_loko_glass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/soda/dr_gibb
glass_icon_state = "dr_gibb_glass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/adminordrazine
glass_icon_state = "golden_cup"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/singulo
glass_icon_state = "singulo"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/silencer
glass_icon_state = "silencerglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/snowwhite
glass_icon_state = "snowwhite"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/antifreeze
glass_icon_state = "antifreeze"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/barefoot
glass_icon_state = "b&p"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/booger
glass_icon_state = "booger"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/devilskiss
glass_icon_state = "devilskiss"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/syndicatebomb
glass_icon_state = "syndicatebomb"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/narsour
glass_icon_state = "narsour"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/cogchamp
glass_icon_state = "cogchamp"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/alliescocktail
glass_icon_state = "alliescocktail"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/erikasurprise
glass_icon_state = "erikasurprise"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
//Ported drinks
/datum/reagent/ethanol/fetching_fizz
glass_icon_state = "fetching_fizz"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/hearty_punch
glass_icon_state = "hearty_punch"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/squirt_cider
glass_icon_state = "squirt_cider"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/fringe_weaver
glass_icon_state = "fringe_weaver"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/crevice_spike
glass_icon_state = "crevice_spike"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/duplex
glass_icon_state = "duplex"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/mauna_loa
glass_icon_state = "mauna_loa"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/hiveminderaser
glass_icon_state = "hiveminderaser"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
//////////////////CHOMP//////////////////////////
/datum/reagent/ethanol/cloverclub
glass_icon_state = "cloverclub"
glass_icon_source = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/ethanol/spiderdrink
glass_icon_state = "glassofspiders"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/tea/minttea
glass_icon_state = "bigteacup"
/datum/reagent/drink/tea/lemontea
glass_icon_state = "bigteacup"
/datum/reagent/drink/tea/limetea
glass_icon_state = "bigteacup"
/datum/reagent/drink/tea/orangetea
glass_icon_state = "bigteacup"
/datum/reagent/drink/tea/berrytea
glass_icon_state = "bigteacup"
/datum/reagent/drink/tea/cherrytea
glass_icon_state = "bigteacup"
/datum/reagent/drink/tea/watermelontea
glass_icon_state = "bigteacup"
/datum/reagent/drink/bubbleteawatermelon
glass_icon_state = "bubbleteawatermelonglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=9)
/datum/reagent/drink/bubbleteastrawberry
glass_icon_state = "bubbleteastrawberryglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=9)
/datum/reagent/drink/bubbleteacherry
glass_icon_state = "bubbleteacherryglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=9)
/datum/reagent/drink/bubbleteacoffee
glass_icon_state = "bubbleteacoffeeglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=9)
/datum/reagent/drink/bubbleteabanana
glass_icon_state = "bubbleteabananaglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=9)
/datum/reagent/drink/tea/matcha_latte
glass_icon_state = "bigteacup"
/datum/reagent/drink/horchata
glass_icon_state = "horchata"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=7)
/datum/reagent/toxin/bluetrain
glass_icon_state = "bluetrain"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/lovepotion
glass_icon_state = "lovepotion"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/lowpower
glass_icon_state = "lowpower"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/coffee/jackbrew
glass_icon_state = "jackbrew"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/bookwyrm
glass_icon_state = "bookwyrm"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/highpower
glass_icon_state = "highpower"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/flapper
glass_icon_state = "flapper"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/toxin/oilslide
glass_icon_state = "oilslide"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/sitonmyface
glass_icon_state = "sitonmyface"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/hachi
glass_icon_state = "hachi"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/mojito
glass_icon_state = "mojito"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/slimedrink
glass_icon_state = "slimedrink"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/arachnidslammer
glass_icon_state = "arachnidslammer"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/pilk
glass_icon_state = "whiskeyglass"
//Visual Updates of existing drinks
/datum/reagent/ethanol/gintonic
glass_icon_state = "gintonicglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/coffee/kahlua
glass_icon_state = "kahluaglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/wine
glass_icon_state = "wineglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/cognac
glass_icon_state = "cognacglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/cuba_libre
glass_icon_state = "cubalibreglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/manly_dorf
glass_icon_state = "manlydorfglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/tequilla_sunrise
glass_icon_state = "tequilasunriseglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/screwdrivercocktail
glass_icon_state = "screwdriverglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/bloody_mary
glass_icon_state = "bloodymaryglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/coffee/brave_bull
glass_icon_state = "bravebullglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/doctor_delight
glass_icon_state = "doctorsdelightglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/soda/space_up
glass_icon_state = "space-up_glass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/vodkatonic
glass_icon_state = "vodkatonicglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/manhattan
glass_icon_state = "manhattanglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/manhattan_proj
glass_icon_state = "proj_manhattanglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/ginfizz
glass_icon_state = "ginfizzglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/longislandicedtea
glass_icon_state = "longislandicedteaglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/threemileisland
glass_icon_state = "threemileislandglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/margarita
glass_icon_state = "margaritaglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/soda/spacemountainwind
glass_icon_state = "Space_mountain_wind_glass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/thirteenloko
glass_icon_state = "thirteen_loko_glass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/drink/soda/dr_gibb
glass_icon_state = "dr_gibb_glass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/adminordrazine
glass_icon_state = "golden_cup"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/singulo
glass_icon_state = "singulo"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/silencer
glass_icon_state = "silencerglass"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/snowwhite
glass_icon_state = "snowwhite"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/antifreeze
glass_icon_state = "antifreeze"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/barefoot
glass_icon_state = "b&p"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/booger
glass_icon_state = "booger"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/devilskiss
glass_icon_state = "devilskiss"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/syndicatebomb
glass_icon_state = "syndicatebomb"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/narsour
glass_icon_state = "narsour"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/cogchamp
glass_icon_state = "cogchamp"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/alliescocktail
glass_icon_state = "alliescocktail"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/erikasurprise
glass_icon_state = "erikasurprise"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
//Ported drinks
/datum/reagent/ethanol/fetching_fizz
glass_icon_state = "fetching_fizz"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/hearty_punch
glass_icon_state = "hearty_punch"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/squirt_cider
glass_icon_state = "squirt_cider"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/fringe_weaver
glass_icon_state = "fringe_weaver"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/crevice_spike
glass_icon_state = "crevice_spike"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/duplex
glass_icon_state = "duplex"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/mauna_loa
glass_icon_state = "mauna_loa"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
/datum/reagent/ethanol/hiveminderaser
glass_icon_state = "hiveminderaser"
glass_icon_file = 'modular_chomp/icons/obj/drinks.dmi'
@@ -1,10 +1,10 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/snaps
name = "Akvavit"
desc = "This could go well with lunch."
icon = 'modular_chomp/icons/obj/drinks.dmi'
icon_state = "snapsbottle"
center_of_mass = list("x"=17, "y"=3)
/obj/item/weapon/reagent_containers/food/drinks/bottle/snaps/Initialize()
. = ..()
reagents.add_reagent("snaps", 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/snaps
name = "Akvavit"
desc = "This could go well with lunch."
icon = 'modular_chomp/icons/obj/drinks.dmi'
icon_state = "snapsbottle"
center_of_mass = list("x"=17, "y"=3)
/obj/item/weapon/reagent_containers/food/drinks/bottle/snaps/Initialize()
. = ..()
reagents.add_reagent("snaps", 100)
@@ -1,82 +1,82 @@
/obj/item/weapon/reagent_containers/food/snacks/deathclawmeat
name = "Death claw Meat"
desc = "A slice from a deathclaw"
icon_state = "meat"
center_of_mass = list("x"=17, "y"=16)
nutriment_amt = 3
nutriment_desc = list("protein" = 6, "deathblood" = 6)
bitesize = 6
/obj/item/weapon/reagent_containers/food/snacks/deathclawmeat/Initialize()
. = ..()
reagents.add_reagent("protein", 6)
reagents.add_reagent("deathblood", 6)
/obj/item/weapon/reagent_containers/food/snacks/dragonmeat
name = "Dragon Meat"
desc = "A slice from a mighty dragon"
icon_state = "meat"
center_of_mass = list("x"=17, "y"=16)
nutriment_amt = 3
nutriment_desc = list("protein" = 6, "liquidfire" = 6)
bitesize = 6
/obj/item/weapon/reagent_containers/food/snacks/dragonmeat/Initialize()
. = ..()
reagents.add_reagent("protein", 6)
reagents.add_reagent("liquidfire", 6)
/obj/item/weapon/reagent_containers/food/snacks/phorondragonmeat
name = "Phoron Dragon Meat"
desc = "A slice from a mighty dragon"
icon_state = "meat"
center_of_mass = list("x"=17, "y"=16)
nutriment_amt = 3
nutriment_desc = list("protein" = 6, "neoliquidfire" = 6, "phoron" = 3)
bitesize = 6
/obj/item/weapon/reagent_containers/food/snacks/phorondragonmeat/Initialize()
. = ..()
reagents.add_reagent("protein", 6)
reagents.add_reagent("neoliquidfire", 6)
reagents.add_reagent("phoron", 3)
/obj/item/weapon/reagent_containers/food/snacks/metroidmeat
name = "Metroid Slice"
desc = "A slice from a metroid"
icon_state = "meat"
center_of_mass = list("x"=17, "y"=16)
nutriment_amt = 3
nutriment_desc = list("protein" = 3, "liquidlife" = 3)
bitesize = 6
/obj/item/weapon/reagent_containers/food/snacks/metroidmeat/Initialize()
. = ..()
reagents.add_reagent("protein", 3)
reagents.add_reagent("liquidlife", 3)
/obj/item/weapon/reagent_containers/food/snacks/meat/raymeat
name = "Solar Ray Meat"
desc = "You aren't sure how ediable this is"
icon_state = "meat"
center_of_mass = list("x"=17, "y"=16)
nutriment_amt = 3
nutriment_desc = list("protein" = 3, "capsaicin" = 8, "condensedcapsaicin" = 8)
/obj/item/weapon/reagent_containers/food/snacks/meat/eelmeat
name = "Eel Meat"
desc = "A slice from an eel"
icon_state = "meat"
center_of_mass = list("x"=17, "y"=16)
nutriment_amt = 3
nutriment_desc = list("protein" = 3, "shockchem" = 1)
/obj/item/weapon/reagent_containers/food/snacks/meat/gravityshell
name = "Gravity Shell Meat"
desc = "A slice from a gravity shell"
icon_state = "meat"
center_of_mass = list("x"=17, "y"=16)
nutriment_amt = 3
/obj/item/weapon/reagent_containers/food/snacks/deathclawmeat
name = "Death claw Meat"
desc = "A slice from a deathclaw"
icon_state = "meat"
center_of_mass = list("x"=17, "y"=16)
nutriment_amt = 3
nutriment_desc = list("protein" = 6, "deathblood" = 6)
bitesize = 6
/obj/item/weapon/reagent_containers/food/snacks/deathclawmeat/Initialize()
. = ..()
reagents.add_reagent("protein", 6)
reagents.add_reagent("deathblood", 6)
/obj/item/weapon/reagent_containers/food/snacks/dragonmeat
name = "Dragon Meat"
desc = "A slice from a mighty dragon"
icon_state = "meat"
center_of_mass = list("x"=17, "y"=16)
nutriment_amt = 3
nutriment_desc = list("protein" = 6, "liquidfire" = 6)
bitesize = 6
/obj/item/weapon/reagent_containers/food/snacks/dragonmeat/Initialize()
. = ..()
reagents.add_reagent("protein", 6)
reagents.add_reagent("liquidfire", 6)
/obj/item/weapon/reagent_containers/food/snacks/phorondragonmeat
name = "Phoron Dragon Meat"
desc = "A slice from a mighty dragon"
icon_state = "meat"
center_of_mass = list("x"=17, "y"=16)
nutriment_amt = 3
nutriment_desc = list("protein" = 6, "neoliquidfire" = 6, "phoron" = 3)
bitesize = 6
/obj/item/weapon/reagent_containers/food/snacks/phorondragonmeat/Initialize()
. = ..()
reagents.add_reagent("protein", 6)
reagents.add_reagent("neoliquidfire", 6)
reagents.add_reagent("phoron", 3)
/obj/item/weapon/reagent_containers/food/snacks/metroidmeat
name = "Metroid Slice"
desc = "A slice from a metroid"
icon_state = "meat"
center_of_mass = list("x"=17, "y"=16)
nutriment_amt = 3
nutriment_desc = list("protein" = 3, "liquidlife" = 3)
bitesize = 6
/obj/item/weapon/reagent_containers/food/snacks/metroidmeat/Initialize()
. = ..()
reagents.add_reagent("protein", 3)
reagents.add_reagent("liquidlife", 3)
/obj/item/weapon/reagent_containers/food/snacks/meat/raymeat
name = "Solar Ray Meat"
desc = "You aren't sure how ediable this is"
icon_state = "meat"
center_of_mass = list("x"=17, "y"=16)
nutriment_amt = 3
nutriment_desc = list("protein" = 3, "capsaicin" = 8, "condensedcapsaicin" = 8)
/obj/item/weapon/reagent_containers/food/snacks/meat/eelmeat
name = "Eel Meat"
desc = "A slice from an eel"
icon_state = "meat"
center_of_mass = list("x"=17, "y"=16)
nutriment_amt = 3
nutriment_desc = list("protein" = 3, "shockchem" = 1)
/obj/item/weapon/reagent_containers/food/snacks/meat/gravityshell
name = "Gravity Shell Meat"
desc = "A slice from a gravity shell"
icon_state = "meat"
center_of_mass = list("x"=17, "y"=16)
nutriment_amt = 3
nutriment_desc = list("protein" = 24)
+51 -51
View File
@@ -1,52 +1,52 @@
/datum/seed/flower/sunflower
mutants = list("solarflower", "soulflower")
/datum/seed/cherries
mutants = list("cherrybomb")
/datum/seed/citrus/orange
mutants = list("nuclearorange", "livewireorange" )
/datum/seed/flower/sunflower/soulflower
name = "soulflower"
seed_name = "soulflower"
display_name = "soulflowers"
chems = list("nutriment" = list(1,10), "souldew" = list(1,13))
mutants = null
/datum/seed/flower/sunflower/soulflower/New()
..()
set_trait(TRAIT_PRODUCT_COLOUR,"#00FFFF")
set_trait(TRAIT_BIOLUM,1)
set_trait(TRAIT_BIOLUM_COLOUR,"#00FFFF")
set_trait(TRAIT_POTENCY,25)
set_trait(TRAIT_MATURATION,10)
set_trait(TRAIT_YIELD,1)
set_trait(TRAIT_SPREAD,1)
/datum/seed/cherries/cherrybomb
name = "cherrybomb"
seed_name = "cherrybomb"
seed_noun = "pits"
display_name = "cherry bomb tree"
chems = list("nutriment" = list(1,15), "neoliquidfire" = list(1,15), "cherryjelly" = list(10,15))
/datum/seed/cherries/cherrybomb/New()
..()
set_trait(TRAIT_PRODUCT_COLOUR,"#993399")
set_trait(TRAIT_BIOLUM,1)
set_trait(TRAIT_BIOLUM_COLOUR,"#993399")
/datum/seed/citrus/orange/livewireorange
name = "livewireorange"
seed_name = "livewireorange"
seed_noun = "livewireorange"
display_name = "livewire orange tree"
chems = list("nutriment" = list(1,15), "liquidlife" = list(1,15), "orangejuice" = list(10,15))
/datum/seed/citrus/orange/nuclearorange
name = "nuclearorange"
seed_name = "nuclearorange"
seed_noun = "nuclearorange"
display_name = "nuclear orange tree"
/datum/seed/flower/sunflower
mutants = list("solarflower", "soulflower")
/datum/seed/cherries
mutants = list("cherrybomb")
/datum/seed/citrus/orange
mutants = list("nuclearorange", "livewireorange" )
/datum/seed/flower/sunflower/soulflower
name = "soulflower"
seed_name = "soulflower"
display_name = "soulflowers"
chems = list("nutriment" = list(1,10), "souldew" = list(1,13))
mutants = null
/datum/seed/flower/sunflower/soulflower/New()
..()
set_trait(TRAIT_PRODUCT_COLOUR,"#00FFFF")
set_trait(TRAIT_BIOLUM,1)
set_trait(TRAIT_BIOLUM_COLOUR,"#00FFFF")
set_trait(TRAIT_POTENCY,25)
set_trait(TRAIT_MATURATION,10)
set_trait(TRAIT_YIELD,1)
set_trait(TRAIT_SPREAD,1)
/datum/seed/cherries/cherrybomb
name = "cherrybomb"
seed_name = "cherrybomb"
seed_noun = "pits"
display_name = "cherry bomb tree"
chems = list("nutriment" = list(1,15), "neoliquidfire" = list(1,15), "cherryjelly" = list(10,15))
/datum/seed/cherries/cherrybomb/New()
..()
set_trait(TRAIT_PRODUCT_COLOUR,"#993399")
set_trait(TRAIT_BIOLUM,1)
set_trait(TRAIT_BIOLUM_COLOUR,"#993399")
/datum/seed/citrus/orange/livewireorange
name = "livewireorange"
seed_name = "livewireorange"
seed_noun = "livewireorange"
display_name = "livewire orange tree"
chems = list("nutriment" = list(1,15), "liquidlife" = list(1,15), "orangejuice" = list(10,15))
/datum/seed/citrus/orange/nuclearorange
name = "nuclearorange"
seed_name = "nuclearorange"
seed_noun = "nuclearorange"
display_name = "nuclear orange tree"
chems = list("nutriment" = list(1,15), "deathblood" = list(1,15), "lemonjuice" = list(10,15))
@@ -1,7 +1,7 @@
/datum/material/valhollide //buffed protection and reflectivity
protectiveness = 70
reflectivity = 0.75
/datum/material/morphium //buffed protection
/datum/material/valhollide //buffed protection and reflectivity
protectiveness = 70
reflectivity = 0.75
/datum/material/morphium //buffed protection
protectiveness = 65
@@ -1,53 +1,53 @@
/datum/material/durasteel //Slightly nerfed protectivness
protectiveness = 55
/datum/material/titanium //Adjusted hardness, reflective, and protection
hardness = 60
protectiveness = 30
reflectivity = 0.3
/datum/material/iron //Adjusted hardness, reflective, and protection
hardness = 70
protectiveness = 20
reflectivity = 0.1
/datum/material/lead //Adjusted hardness, reflective, and protection
hardness = 60
protectiveness = 15
reflectivity = 0.1
/datum/material/gold //Adjusted reflective, and protection
hardness = 50
protectiveness = 30
reflectivity = 0.05
/datum/material/silver //Adjusted reflective, and protection
hardness = 60
protectiveness = 30
reflectivity = 0.2
/datum/material/platinum //Adjusted hardness, reflective, and protection
hardness = 60
protectiveness = 30
reflectivity = 0.0
/datum/material/uranium //Adjusted hardness, reflective, and protection
hardness = 70
protectiveness = 30
reflectivity = 0.5
/datum/material/mhydrogen //Adjusted hardness, reflective, and protection. And weight.
hardness = 75
protectiveness = 40
reflectivity = 0.4
weight = 5
/datum/material/osmium //Adjusted hardness, reflective, and protection
hardness = 65
protectiveness = 30
/datum/material/durasteel //Slightly nerfed protectivness
protectiveness = 55
/datum/material/titanium //Adjusted hardness, reflective, and protection
hardness = 60
protectiveness = 30
reflectivity = 0.3
/datum/material/iron //Adjusted hardness, reflective, and protection
hardness = 70
protectiveness = 20
reflectivity = 0.1
/datum/material/lead //Adjusted hardness, reflective, and protection
hardness = 60
protectiveness = 15
reflectivity = 0.1
/datum/material/gold //Adjusted reflective, and protection
hardness = 50
protectiveness = 30
reflectivity = 0.05
/datum/material/silver //Adjusted reflective, and protection
hardness = 60
protectiveness = 30
reflectivity = 0.2
/datum/material/platinum //Adjusted hardness, reflective, and protection
hardness = 60
protectiveness = 30
reflectivity = 0.0
/datum/material/uranium //Adjusted hardness, reflective, and protection
hardness = 70
protectiveness = 30
reflectivity = 0.5
/datum/material/mhydrogen //Adjusted hardness, reflective, and protection. And weight.
hardness = 75
protectiveness = 40
reflectivity = 0.4
weight = 5
/datum/material/osmium //Adjusted hardness, reflective, and protection
hardness = 65
protectiveness = 30
reflectivity = 0.1
@@ -1,44 +1,44 @@
/datum/material/chitin
protectiveness = 25
reflectivity = 0.05
/datum/material/deathclawscale
name = "deathclaw scale"
icon_colour = "#8d6653"
icon_base = "solid"
icon_reinf = "reinf_mesh"
hardness = 50
protectiveness = 40
reflectivity = 0.4
conductivity = 1
/datum/material/dragonscale
name = "dragon scale"
icon_colour = "#ffffff"
icon_base = "solid"
icon_reinf = "reinf_mesh"
hardness = 50
protectiveness = 75
reflectivity = 0.6
conductivity = 1
/datum/material/phorondragonscale
name = "phoron dragon scale"
icon_colour = "#8d6653"
icon_base = "solid"
icon_reinf = "reinf_mesh"
hardness = 10
protectiveness = 80
reflectivity = 0.8
conductivity = 1
/datum/material/xenochitin
name = "xenochitin"
icon_colour = "#8d6653"
icon_base = "solid"
icon_reinf = "reinf_mesh"
hardness = 40
protectiveness = 40
reflectivity = 0.6
/datum/material/chitin
protectiveness = 25
reflectivity = 0.05
/datum/material/deathclawscale
name = "deathclaw scale"
icon_colour = "#8d6653"
icon_base = "solid"
icon_reinf = "reinf_mesh"
hardness = 50
protectiveness = 40
reflectivity = 0.4
conductivity = 1
/datum/material/dragonscale
name = "dragon scale"
icon_colour = "#ffffff"
icon_base = "solid"
icon_reinf = "reinf_mesh"
hardness = 50
protectiveness = 75
reflectivity = 0.6
conductivity = 1
/datum/material/phorondragonscale
name = "phoron dragon scale"
icon_colour = "#8d6653"
icon_base = "solid"
icon_reinf = "reinf_mesh"
hardness = 10
protectiveness = 80
reflectivity = 0.8
conductivity = 1
/datum/material/xenochitin
name = "xenochitin"
icon_colour = "#8d6653"
icon_base = "solid"
icon_reinf = "reinf_mesh"
hardness = 40
protectiveness = 40
reflectivity = 0.6
conductivity = 0.5
@@ -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
+16 -16
View File
@@ -1,17 +1,17 @@
/datum/weather/sif/fog
name = "fog"
icon_state = "fog"
wind_high = 1
wind_low = 0
light_modifier = 0.7
temp_high = T0C // 0c
temp_low = 263.15 // -10c
transition_chances = list(
WEATHER_FOG = 35,
WEATHER_CLEAR = 35,
WEATHER_OVERCAST = 15,
WEATHER_LIGHT_SNOW = 10,
WEATHER_RAIN = 5
/datum/weather/sif/fog
name = "fog"
icon_state = "fog"
wind_high = 1
wind_low = 0
light_modifier = 0.7
temp_high = T0C // 0c
temp_low = 263.15 // -10c
transition_chances = list(
WEATHER_FOG = 35,
WEATHER_CLEAR = 35,
WEATHER_OVERCAST = 15,
WEATHER_LIGHT_SNOW = 10,
WEATHER_RAIN = 5
)
@@ -1,45 +1,45 @@
/turf/simulated/floor/outdoors/grass/smokestar
name = "strange moss"
icon = 'modular_chomp/icons/turf/falseplanets.dmi'
icon_state = "moss"
can_dig = TRUE
/*unsure how needed this variable will need to be changed
turf_layers = list(
/turf/simulated/floor/outdoors/rocks,
/turf/simulated/floor/outdoors/dirt
)
*/
grass_chance = 15
animal_chance = 0.1
animal_types = list(
/mob/living/simple_mob/vore/smokestar/drider = 1
)
grass_types = list(
/obj/structure/flora/opalflowers,
/obj/structure/flora/weepinggrass,
/obj/random/outcrop
)
/obj/structure/flora/opalflowers
name = "opal flower"
icon = 'modular_chomp/icons/obj/strangeflora.dmi'
icon_state = "opal"
destroy_on_harvest = TRUE
harvest_tool = /obj/item/weapon/material/knife
randomize_harvest_count = TRUE
harvest_loot = list(/obj/item/stack/material/void_opal = 1)
/obj/structure/flora/weepinggrass
name = "strange grass"
icon = 'modular_chomp/icons/obj/strangeflora.dmi'
icon_state = "weep"
destroy_on_harvest = TRUE
harvest_tool = /obj/item/weapon/material/knife
randomize_harvest_count = TRUE
/turf/simulated/floor/outdoors/grass/smokestar
name = "strange moss"
icon = 'modular_chomp/icons/turf/falseplanets.dmi'
icon_state = "moss"
can_dig = TRUE
/*unsure how needed this variable will need to be changed
turf_layers = list(
/turf/simulated/floor/outdoors/rocks,
/turf/simulated/floor/outdoors/dirt
)
*/
grass_chance = 15
animal_chance = 0.1
animal_types = list(
/mob/living/simple_mob/vore/smokestar/drider = 1
)
grass_types = list(
/obj/structure/flora/opalflowers,
/obj/structure/flora/weepinggrass,
/obj/random/outcrop
)
/obj/structure/flora/opalflowers
name = "opal flower"
icon = 'modular_chomp/icons/obj/strangeflora.dmi'
icon_state = "opal"
destroy_on_harvest = TRUE
harvest_tool = /obj/item/weapon/material/knife
randomize_harvest_count = TRUE
harvest_loot = list(/obj/item/stack/material/void_opal = 1)
/obj/structure/flora/weepinggrass
name = "strange grass"
icon = 'modular_chomp/icons/obj/strangeflora.dmi'
icon_state = "weep"
destroy_on_harvest = TRUE
harvest_tool = /obj/item/weapon/material/knife
randomize_harvest_count = TRUE
harvest_loot = list(/obj/item/stack/material/fiber = 1)
@@ -1,83 +1,83 @@
/* List of player tips
Weighted to emphasize more important over less.area
Weights are not additive. You can have multiple prob(50) items.
prob(50) makes it half as likely to appear and so forth.
When editing the list, please try and keep similar probabilities near each other. High on top, low on bottom */
//argument determines if to pick a random tip or use a forced choice.
/datum/player_tips/proc/pick_tip(var/isSpecific)
var/choice = null
if(!(isSpecific == "none" || isSpecific == "general" || isSpecific == "gameplay" || isSpecific == "roleplay" || isSpecific == "lore" ))
choice = "none" //Making sure that wrong arguments still give tips.
if(isSpecific == "none")
choice = pick (
prob(50); "general",
prob(50); "gameplay",
prob(25); "roleplay",
prob(20); "lore"
)
else
choice = isSpecific
switch(choice)
if("general")
var/info = "The following is a general tip for playing on CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of the character setup! \n"
return pick(
prob(60); "[info] Got a question about gameplay, roleplay or the setting? Press F1 to Mentorhelp!",
prob(60); "[info] We have a wiki that is actively updated! Please check it out at https://wiki.chompstation13.net/index.php/Chomp_Station_Wiki for help!",
prob(60); "[info] Unsure about rules? Press F1 and ask our admins for clarification - they are happy to help.",
prob(30); "[info] Don't be afraid to approach your fellow players for advice! Learning things ICly can help build powerful bonds!",
prob(30); "[info] Need some guidance making a character or with roleplay concepts? Our discord's tutoring channel is happy to help!",
prob(30); "[info] Having difficulties getting started? Pressing F3 to speak and typing '; Hello! I'm a new hire. Could someone please give me a tour?' or as appropriate for your character is a good way to start! More help available at: https://wiki.chompstation13.net/index.php/The_Basics",
prob(30); "[info] Want to try out a new department? Consider joining as an intern when it's well-staffed. Our players enjoy teaching eager students. You can approach such roleplay as simply getting taught the local technologies, procedures - you don't need to be 'fresh out of school' to justify it!",
prob(30); "[info] Our discord is an excellent resource to stay up to date about changes and events! If wanting to separate your kink and real identities, Discord has a built in means to swap accounts within the client. It is OK to lurk!",
prob(5); "[info] Got another tip for the list? Please let us know on Discord in the feedback forums!"
)
if("gameplay")
var/info = "The following is a gameplay-focused tip for playing on CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of the character setup! \n"
return pick(
prob(50); "[info] To talk to your fellow coworkers, use ';'! You may append it by an exclamation mark, like ';!' to perform an audiable emote. ",
prob(50); "[info] Lost on the map? You can find In-Character help by speaking on the Common Radio. You can do this by pressing F3 and typing ' ; ' before your message. Your fellow co-workers will likely help. If OOC help is preferred, press F1 for mentorhelp. ",
prob(50); "[info] You may set your suit sensors by clicking on the icon in the bottom left corner, then right click the clothes that appear right above it. It is recommended to turn on suit sensors to 'TRACKING' before doing anything dangerous like mining, and to turn them off before digestion scenes as prey.",
prob(35); "[info] It is never a bad idea to visit the medbay if you get injured - small burns and cuts can get infected and become harder to treat! If there is no medical staff, bathrooms and the bar often have a NanoMed on the wall, while a medical station can be found on the first deck - with ointments to disinfect cuts and burns, bandages to treat bruises and encourage healing.",
prob(25); "[info] Two control modes exist for SS13 - hotkey ON and hotkey OFF. You can swap between the two modes by pressing TAB. In hotkey mode, to chat you need to press T to say anything which creates a small talking bubble.",
prob(25); "[info] Do you want to shift your character around, for instance to appear as if leaning on the wall? Press CTRL + SHIFT + arrow keys to do so! Moving resets this.",
prob(25); "[info] Emergency Fire Doors seal breaches and keep active fires out. Please do not open them without good reason. SHIFT + CLICK them to get temperature and atmospheric pressure readings.",
prob(25); "[info] The kitchen's Oven can fit multiple ingredients in one slot if you pull the baking tray out first. This is required for most recipes, and the Grille and Deep Frier work the same way!",
prob(10); "[info] Not every hostile NPC you encounter while mining or exploring needs to be defeated. Sometimes, it's better to avoid or run away from them.",
prob(1); "[info] Stay robust, my friends.",
prob(35); "[info] You can insert your ID into your PDA. This frees up your belt from having to carry your PDA. Furthermore, by clicking and dragging the PDA to the game screen, you can use it without holding it!",
prob(35); "[info] Your vore-bellies have multiple add-ons! Muffling is excellent to ensure your prey does not accidentally inform everyone about their predicament, and jam suit sensors is a great courtesy to avoid medical being worried about your prey!",
prob(35); "[info] Remember to check your vore panel preferences! There you can find toggles for things other than just vore(tm), such as stepping mechanics and spontaneous transformation.",
prob(25); "[info] If you would like to toggle stepping mechanics, head to the vore panel and click on personal preferences! Disabling stepping mechanics will disable stepping descriptions and will prevent your character from taking damage if a bigger character walks over yours with harm intent. Your character will still be stunned, however."
)
if("roleplay")
var/info = "The following is a roleplay-focused tip for playing on CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of the character setup! \n"
return pick(
prob(50); "[info] Having difficulty finding scenes? The number one tip is to be active! Generally speaking, people are more likely to interact with you if you are moving about and doing things. Don't be afraid to talk to people, you're less likely to be approached if you're sat alone at a table silently. People that are looking for scenes generally like to see how you type and RP before they'll start working towards a scene with you.",
prob(50); "[info] Please avoid a character that knows everything. Having only a small set of jobs you are capable of doing can help flesh out your character! It's OK for things to break and fail if nobody is around to fix it - you do not need to do others' jobs.",
prob(25); "[info] Embrace the limits of your character's skillsets! Seeking out other players to help you with a more challenging task might build friendships, or even lead to a scene!",
prob(25); "[info] Slowing down when meeting another player can help with finding roleplay! Your fellow player might be typing up a greeting or an emote, and if you run off you won't see it!",
prob(25); "[info] It is a good idea to wait a few moments after using mechanics like lick, hug or headpat on another player. They might be typing up a response or wish to reciprocate, and if you run away you might miss out!",
prob(25); "[info] Participating in an away mission and see something acting strange? Try emoting or talking to it before resorting to fighting. It may be a GM event!",
prob(15); "[info] We are a medium roleplay server. This does not neccessarily mean 'serious' roleplay, levity and light-hearted RP is more than welcome! Please do not ignore people just because it is unlikely you will be able to scene.",
prob(10); "[info] Sending faxes to central command, using the 'pray' verb or pressing F1 to ahelp are highly encouraged when exploring the gateway or overmap locations! Letting GMs know something fun is happening allows them to spice things up and make the world feel alive!",
prob(40); "[info] Just because you see something doesn't mean your character has to. A courtesy 'missing' of contraband or scene details can go a long way towards preserving everyone's fun!",
prob(25); "[info] It is always a good idea to communicate on your department's private channel (whose key you can learn by examining your headset) when responding to an emergency! This lets your coworkers know if they might be needed!",
prob(25); "[info] While following the SOP is not mandatory, and you are free to break it (albeit, with potential in-character consequences), departments like security and medical do well to be familiar with them! https://wiki.chompstation13.net/index.php/Standard_Operating_Procedure",
prob(25); "[info] Think a player is acting especially antagonistic? It might be better to Ahelp (with F1) rather than try to deal with it icly, staff can make sure it's all okay.",
prob(20); "[info] See a minor infraction as Security with a minimal time punishment? Consider using your ticket printer to give a non obtrusive punishment."
)
if("lore")
var/info = "The following is a tip for understanding the lore of CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of the character setup! \n"
return pick(
prob(25); "[info] Our lore is somewhat in line with other servers. The year is 2568 (current year+544).",
prob(75); "[info] You can find a short summary of our setting that everyone should know at https://wiki.chompstation13.net/index.php/Lore",
prob(50); "[info] You are currently working in the Vir system on the NLS Southern Cross telecommunications and traffic control station. https://wiki.chompstation13.net/index.php/Vir",
prob(50); "[info] The majority of employees live at the Northern Star asteroid colony orbiting a gas giant called Kara. It is also a central hub for visitors, logistics, and mining. This is the place the shuttle takes you at the end of the round. You may visit the mines via the exploration shuttles. https://wiki.chompstation13.net/index.php/NCS_Northern_Star",
prob(10); "[info] Thaler is a universal monopoly money. It is backed and supported by Sol Central and its allies. While ubiquitous in frontier worlds, it has an unfavourable exchange rate with most currencies used by well-settled regions, limiting immigration to places such as Earth. https://wiki.chompstation13.net/index.php/Lore"
)
/* List of player tips
Weighted to emphasize more important over less.area
Weights are not additive. You can have multiple prob(50) items.
prob(50) makes it half as likely to appear and so forth.
When editing the list, please try and keep similar probabilities near each other. High on top, low on bottom */
//argument determines if to pick a random tip or use a forced choice.
/datum/player_tips/proc/pick_tip(var/isSpecific)
var/choice = null
if(!(isSpecific == "none" || isSpecific == "general" || isSpecific == "gameplay" || isSpecific == "roleplay" || isSpecific == "lore" ))
choice = "none" //Making sure that wrong arguments still give tips.
if(isSpecific == "none")
choice = pick (
prob(50); "general",
prob(50); "gameplay",
prob(25); "roleplay",
prob(20); "lore"
)
else
choice = isSpecific
switch(choice)
if("general")
var/info = "The following is a general tip for playing on CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of the character setup! \n"
return pick(
prob(60); "[info] Got a question about gameplay, roleplay or the setting? Press F1 to Mentorhelp!",
prob(60); "[info] We have a wiki that is actively updated! Please check it out at https://wiki.chompstation13.net/index.php/Chomp_Station_Wiki for help!",
prob(60); "[info] Unsure about rules? Press F1 and ask our admins for clarification - they are happy to help.",
prob(30); "[info] Don't be afraid to approach your fellow players for advice! Learning things ICly can help build powerful bonds!",
prob(30); "[info] Need some guidance making a character or with roleplay concepts? Our discord's tutoring channel is happy to help!",
prob(30); "[info] Having difficulties getting started? Pressing F3 to speak and typing '; Hello! I'm a new hire. Could someone please give me a tour?' or as appropriate for your character is a good way to start! More help available at: https://wiki.chompstation13.net/index.php/The_Basics",
prob(30); "[info] Want to try out a new department? Consider joining as an intern when it's well-staffed. Our players enjoy teaching eager students. You can approach such roleplay as simply getting taught the local technologies, procedures - you don't need to be 'fresh out of school' to justify it!",
prob(30); "[info] Our discord is an excellent resource to stay up to date about changes and events! If wanting to separate your kink and real identities, Discord has a built in means to swap accounts within the client. It is OK to lurk!",
prob(5); "[info] Got another tip for the list? Please let us know on Discord in the feedback forums!"
)
if("gameplay")
var/info = "The following is a gameplay-focused tip for playing on CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of the character setup! \n"
return pick(
prob(50); "[info] To talk to your fellow coworkers, use ';'! You may append it by an exclamation mark, like ';!' to perform an audiable emote. ",
prob(50); "[info] Lost on the map? You can find In-Character help by speaking on the Common Radio. You can do this by pressing F3 and typing ' ; ' before your message. Your fellow co-workers will likely help. If OOC help is preferred, press F1 for mentorhelp. ",
prob(50); "[info] You may set your suit sensors by clicking on the icon in the bottom left corner, then right click the clothes that appear right above it. It is recommended to turn on suit sensors to 'TRACKING' before doing anything dangerous like mining, and to turn them off before digestion scenes as prey.",
prob(35); "[info] It is never a bad idea to visit the medbay if you get injured - small burns and cuts can get infected and become harder to treat! If there is no medical staff, bathrooms and the bar often have a NanoMed on the wall, while a medical station can be found on the first deck - with ointments to disinfect cuts and burns, bandages to treat bruises and encourage healing.",
prob(25); "[info] Two control modes exist for SS13 - hotkey ON and hotkey OFF. You can swap between the two modes by pressing TAB. In hotkey mode, to chat you need to press T to say anything which creates a small talking bubble.",
prob(25); "[info] Do you want to shift your character around, for instance to appear as if leaning on the wall? Press CTRL + SHIFT + arrow keys to do so! Moving resets this.",
prob(25); "[info] Emergency Fire Doors seal breaches and keep active fires out. Please do not open them without good reason. SHIFT + CLICK them to get temperature and atmospheric pressure readings.",
prob(25); "[info] The kitchen's Oven can fit multiple ingredients in one slot if you pull the baking tray out first. This is required for most recipes, and the Grille and Deep Frier work the same way!",
prob(10); "[info] Not every hostile NPC you encounter while mining or exploring needs to be defeated. Sometimes, it's better to avoid or run away from them.",
prob(1); "[info] Stay robust, my friends.",
prob(35); "[info] You can insert your ID into your PDA. This frees up your belt from having to carry your PDA. Furthermore, by clicking and dragging the PDA to the game screen, you can use it without holding it!",
prob(35); "[info] Your vore-bellies have multiple add-ons! Muffling is excellent to ensure your prey does not accidentally inform everyone about their predicament, and jam suit sensors is a great courtesy to avoid medical being worried about your prey!",
prob(35); "[info] Remember to check your vore panel preferences! There you can find toggles for things other than just vore(tm), such as stepping mechanics and spontaneous transformation.",
prob(25); "[info] If you would like to toggle stepping mechanics, head to the vore panel and click on personal preferences! Disabling stepping mechanics will disable stepping descriptions and will prevent your character from taking damage if a bigger character walks over yours with harm intent. Your character will still be stunned, however."
)
if("roleplay")
var/info = "The following is a roleplay-focused tip for playing on CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of the character setup! \n"
return pick(
prob(50); "[info] Having difficulty finding scenes? The number one tip is to be active! Generally speaking, people are more likely to interact with you if you are moving about and doing things. Don't be afraid to talk to people, you're less likely to be approached if you're sat alone at a table silently. People that are looking for scenes generally like to see how you type and RP before they'll start working towards a scene with you.",
prob(50); "[info] Please avoid a character that knows everything. Having only a small set of jobs you are capable of doing can help flesh out your character! It's OK for things to break and fail if nobody is around to fix it - you do not need to do others' jobs.",
prob(25); "[info] Embrace the limits of your character's skillsets! Seeking out other players to help you with a more challenging task might build friendships, or even lead to a scene!",
prob(25); "[info] Slowing down when meeting another player can help with finding roleplay! Your fellow player might be typing up a greeting or an emote, and if you run off you won't see it!",
prob(25); "[info] It is a good idea to wait a few moments after using mechanics like lick, hug or headpat on another player. They might be typing up a response or wish to reciprocate, and if you run away you might miss out!",
prob(25); "[info] Participating in an away mission and see something acting strange? Try emoting or talking to it before resorting to fighting. It may be a GM event!",
prob(15); "[info] We are a medium roleplay server. This does not neccessarily mean 'serious' roleplay, levity and light-hearted RP is more than welcome! Please do not ignore people just because it is unlikely you will be able to scene.",
prob(10); "[info] Sending faxes to central command, using the 'pray' verb or pressing F1 to ahelp are highly encouraged when exploring the gateway or overmap locations! Letting GMs know something fun is happening allows them to spice things up and make the world feel alive!",
prob(40); "[info] Just because you see something doesn't mean your character has to. A courtesy 'missing' of contraband or scene details can go a long way towards preserving everyone's fun!",
prob(25); "[info] It is always a good idea to communicate on your department's private channel (whose key you can learn by examining your headset) when responding to an emergency! This lets your coworkers know if they might be needed!",
prob(25); "[info] While following the SOP is not mandatory, and you are free to break it (albeit, with potential in-character consequences), departments like security and medical do well to be familiar with them! https://wiki.chompstation13.net/index.php/Standard_Operating_Procedure",
prob(25); "[info] Think a player is acting especially antagonistic? It might be better to Ahelp (with F1) rather than try to deal with it icly, staff can make sure it's all okay.",
prob(20); "[info] See a minor infraction as Security with a minimal time punishment? Consider using your ticket printer to give a non obtrusive punishment."
)
if("lore")
var/info = "The following is a tip for understanding the lore of CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of the character setup! \n"
return pick(
prob(25); "[info] Our lore is somewhat in line with other servers. The year is 2568 (current year+544).",
prob(75); "[info] You can find a short summary of our setting that everyone should know at https://wiki.chompstation13.net/index.php/Lore",
prob(50); "[info] You are currently working in the Vir system on the NLS Southern Cross telecommunications and traffic control station. https://wiki.chompstation13.net/index.php/Vir",
prob(50); "[info] The majority of employees live at the Northern Star asteroid colony orbiting a gas giant called Kara. It is also a central hub for visitors, logistics, and mining. This is the place the shuttle takes you at the end of the round. You may visit the mines via the exploration shuttles. https://wiki.chompstation13.net/index.php/NCS_Northern_Star",
prob(10); "[info] Thaler is a universal monopoly money. It is backed and supported by Sol Central and its allies. While ubiquitous in frontier worlds, it has an unfavourable exchange rate with most currencies used by well-settled regions, limiting immigration to places such as Earth. https://wiki.chompstation13.net/index.php/Lore"
)
+12 -12
View File
@@ -1,12 +1,12 @@
// prevent gun activation when stealth swimming. The low alpha hides you from NPC AI, which allows you to cheese mobs.
//Just adding onto this code for funny net gun
/obj/item/weapon/gun/special_check(var/mob/user)
var/mob/living/L = user
if(istype(L))
if(L.has_modifier_of_type(/datum/modifier/underwater_stealth))
to_chat(user,"<span class='warning'>You cannot use guns whilst hiding underwater!</span>")
return 0
if(L.has_modifier_of_type(/datum/modifier/rednet))
to_chat(user,"<span class='warning'>Your gun refuses to fire!</span>")
return 0
return ..()
// prevent gun activation when stealth swimming. The low alpha hides you from NPC AI, which allows you to cheese mobs.
//Just adding onto this code for funny net gun
/obj/item/weapon/gun/special_check(var/mob/user)
var/mob/living/L = user
if(istype(L))
if(L.has_modifier_of_type(/datum/modifier/underwater_stealth))
to_chat(user,"<span class='warning'>You cannot use guns whilst hiding underwater!</span>")
return 0
if(L.has_modifier_of_type(/datum/modifier/rednet))
to_chat(user,"<span class='warning'>Your gun refuses to fire!</span>")
return 0
return ..()
@@ -1,2 +1,2 @@
/obj/item/weapon/gun/energy/zip/craftable
/obj/item/weapon/gun/energy/zip/craftable
battery_lock = 1 //makeshift gun has flaws
@@ -1,93 +1,93 @@
/obj/item/weapon/gun/energy
charge_cost = 80
/obj/item/weapon/gun/energy/laser
firemodes = list(
list(mode_name="normal", fire_delay=8, projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 80),
list(mode_name="suppressive", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 20),
)
/obj/item/weapon/gun/energy/lasercannon //This is me trying to make ammo worth while but the cannon...is a cannon.
charge_cost = 300
/obj/item/weapon/gun/energy/lasercannon/mounted
charge_cost = 300
/obj/item/weapon/gun/energy/xray
charge_cost = 65
/obj/item/weapon/gun/energy/sniperrifle
charge_cost = 120
/obj/item/weapon/gun/energy/mininglaser
firemodes = list(
list(mode_name="mining", fire_delay=8, projectile_type=/obj/item/projectile/beam/mininglaser, charge_cost = 65),
list(mode_name="deter", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 25),
)
/obj/item/weapon/gun/energy/laser/vepr
firemodes = list(
list(mode_name="normal", fire_delay=8, projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 80),
list(mode_name="suppressive", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 20),
list(mode_name="burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, charge_cost = 65),
)
/obj/item/weapon/gun/energy/gun
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="egunstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 80),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="egunkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 160),
)
/obj/item/weapon/gun/energy/gun/rifle
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="riflestun", fire_sound='sound/weapons/Taser.ogg', wielded_item_state="riflestun-wielded", charge_cost = 40),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="riflekill", fire_sound='sound/weapons/Laser.ogg', wielded_item_state="riflekill-wielded", charge_cost = 80),
)
/obj/item/weapon/gun/energy/gun/burst //Halving since by 3 seems too much
firemodes = list(
list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="energystun", charge_cost = 50),
list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="energystun"),
list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="energykill", charge_cost = 100),
list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="energykill"),
)
/obj/item/weapon/gun/energy/gun/etommy //Halving this one
firemodes = list(
list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, charge_cost = 100),
list(mode_name="lethal burst", burst=4, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser),
)
/obj/item/weapon/gun/energy/gun/compact
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="PDWstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 80),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="PDWkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 160),
)
/obj/item/weapon/gun/energy/gun/eluger
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="ep08stun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 40),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam/eluger, modifystate="ep08kill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 80),
)
/obj/item/weapon/gun/energy/sf2000
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="lasgunstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 80),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="lasgunkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 160),
)
/obj/item/weapon/gun/energy/gun/burst/mg42 //I am unsure what this weapon is, and it seems cheap on paper but just putting it at 80 for unity
firemodes = list(
list(mode_name="single fire", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="mg42-e", fire_sound='sound/weapons/Laser.ogg', charge_cost = 80),
list(mode_name="burst fire", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="mg42-e", fire_sound='sound/weapons/Laser.ogg'),
list(mode_name="5 laser burst", burst=5, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0,0,0), dispersion=list(0.0, 0.2, 0.5, 0.5, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="mg42-e", fire_sound='sound/weapons/Laser.ogg'),
list(mode_name="15 laser burst, ye boi.", burst=15, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), dispersion=list(0.0, 0.2, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="mg42-e", fire_sound='sound/weapons/Laser.ogg'),
)
/obj/item/weapon/gun/energy/x01
firemodes = list(
list(mode_name="stun", fire_delay = 8, projectile_type= /obj/item/projectile/beam/stun, modifystate="x01stun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 80),
list(mode_name="laser", fire_delay = 8, projectile_type=/obj/item/projectile/beam, modifystate="x01laser", fire_sound='sound/weapons/Laser.ogg', charge_cost = 160),
list(mode_name="gauss", fire_delay=15, projectile_type=/obj/item/projectile/energy/gauss, modifystate="x01gauss", fire_sound='sound/weapons/gauss_shoot.ogg', charge_cost = 120)
/obj/item/weapon/gun/energy
charge_cost = 80
/obj/item/weapon/gun/energy/laser
firemodes = list(
list(mode_name="normal", fire_delay=8, projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 80),
list(mode_name="suppressive", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 20),
)
/obj/item/weapon/gun/energy/lasercannon //This is me trying to make ammo worth while but the cannon...is a cannon.
charge_cost = 300
/obj/item/weapon/gun/energy/lasercannon/mounted
charge_cost = 300
/obj/item/weapon/gun/energy/xray
charge_cost = 65
/obj/item/weapon/gun/energy/sniperrifle
charge_cost = 120
/obj/item/weapon/gun/energy/mininglaser
firemodes = list(
list(mode_name="mining", fire_delay=8, projectile_type=/obj/item/projectile/beam/mininglaser, charge_cost = 65),
list(mode_name="deter", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 25),
)
/obj/item/weapon/gun/energy/laser/vepr
firemodes = list(
list(mode_name="normal", fire_delay=8, projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 80),
list(mode_name="suppressive", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 20),
list(mode_name="burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, charge_cost = 65),
)
/obj/item/weapon/gun/energy/gun
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="egunstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 80),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="egunkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 160),
)
/obj/item/weapon/gun/energy/gun/rifle
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="riflestun", fire_sound='sound/weapons/Taser.ogg', wielded_item_state="riflestun-wielded", charge_cost = 40),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="riflekill", fire_sound='sound/weapons/Laser.ogg', wielded_item_state="riflekill-wielded", charge_cost = 80),
)
/obj/item/weapon/gun/energy/gun/burst //Halving since by 3 seems too much
firemodes = list(
list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="energystun", charge_cost = 50),
list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="energystun"),
list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="energykill", charge_cost = 100),
list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="energykill"),
)
/obj/item/weapon/gun/energy/gun/etommy //Halving this one
firemodes = list(
list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, charge_cost = 100),
list(mode_name="lethal burst", burst=4, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser),
)
/obj/item/weapon/gun/energy/gun/compact
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="PDWstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 80),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="PDWkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 160),
)
/obj/item/weapon/gun/energy/gun/eluger
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="ep08stun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 40),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam/eluger, modifystate="ep08kill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 80),
)
/obj/item/weapon/gun/energy/sf2000
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="lasgunstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 80),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="lasgunkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 160),
)
/obj/item/weapon/gun/energy/gun/burst/mg42 //I am unsure what this weapon is, and it seems cheap on paper but just putting it at 80 for unity
firemodes = list(
list(mode_name="single fire", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="mg42-e", fire_sound='sound/weapons/Laser.ogg', charge_cost = 80),
list(mode_name="burst fire", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="mg42-e", fire_sound='sound/weapons/Laser.ogg'),
list(mode_name="5 laser burst", burst=5, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0,0,0), dispersion=list(0.0, 0.2, 0.5, 0.5, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="mg42-e", fire_sound='sound/weapons/Laser.ogg'),
list(mode_name="15 laser burst, ye boi.", burst=15, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), dispersion=list(0.0, 0.2, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="mg42-e", fire_sound='sound/weapons/Laser.ogg'),
)
/obj/item/weapon/gun/energy/x01
firemodes = list(
list(mode_name="stun", fire_delay = 8, projectile_type= /obj/item/projectile/beam/stun, modifystate="x01stun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 80),
list(mode_name="laser", fire_delay = 8, projectile_type=/obj/item/projectile/beam, modifystate="x01laser", fire_sound='sound/weapons/Laser.ogg', charge_cost = 160),
list(mode_name="gauss", fire_delay=15, projectile_type=/obj/item/projectile/energy/gauss, modifystate="x01gauss", fire_sound='sound/weapons/gauss_shoot.ogg', charge_cost = 120)
)
@@ -1,56 +1,56 @@
/obj/item/weapon/gun/energy/medigun/mounted
name = "mounted directed restoration system"
self_recharge = 1
use_external_power = 1
/obj/item/weapon/gun/energy/taser/disabler/slow
name = "plasma snare device"
desc = "A modified disabler adjusted to impulse a target with a restrictive slowdown."
icon_state = "disabler"
projectile_type = /obj/item/projectile/energy/plasmastun/slow
charge_cost = 480
self_recharge = 1
recharge_time = 3
/obj/item/projectile/energy/plasmastun/slow
name = "plasma pulse"
icon_state = "plasma_stun"
fire_sound = 'sound/weapons/weaponsounds_laserstrong.ogg'
armor_penetration = 10
range = 9
damage = 0
agony = 0
vacuum_traversal = 1
hud_state = "plasma_rifle_blast"
/obj/item/projectile/energy/plasmastun/slow/on_hit(var/atom/target)
if(isliving(target))
var/mob/living/L = target
L.add_modifier(/datum/modifier/entangled, 10 SECONDS)
/obj/item/weapon/gun/energy/rednetgun
name = "experimental capture gun"
desc = "An experimental gun, in efforts to expand net gun technology. Utilizing eletronic interferance and a \
heat aura it in theory stops the subject from fighting back."
icon_state = "goldstunrevolver"
item_state = null
projectile_type = /obj/item/projectile/energy/rednet
charge_cost = 1440 //so a taser has 15 shots at 480 and I want five but this feels goofy
/obj/item/projectile/energy/rednet
name = "expirmental energy net"
icon_state = "toxin"
damage = 0
check_armour = "energy"
hud_state = "pistol_tranq"
fire_sound = 'sound/weapons/Taser.ogg'
nodamage = 1
modifier_type_to_apply = /datum/modifier/rednet
modifier_duration = 0.5 MINUTE
speed = 1.5
/datum/modifier/rednet
mob_overlay_state = "red_electricity_constant"
/obj/item/weapon/gun/energy/medigun/mounted
name = "mounted directed restoration system"
self_recharge = 1
use_external_power = 1
/obj/item/weapon/gun/energy/taser/disabler/slow
name = "plasma snare device"
desc = "A modified disabler adjusted to impulse a target with a restrictive slowdown."
icon_state = "disabler"
projectile_type = /obj/item/projectile/energy/plasmastun/slow
charge_cost = 480
self_recharge = 1
recharge_time = 3
/obj/item/projectile/energy/plasmastun/slow
name = "plasma pulse"
icon_state = "plasma_stun"
fire_sound = 'sound/weapons/weaponsounds_laserstrong.ogg'
armor_penetration = 10
range = 9
damage = 0
agony = 0
vacuum_traversal = 1
hud_state = "plasma_rifle_blast"
/obj/item/projectile/energy/plasmastun/slow/on_hit(var/atom/target)
if(isliving(target))
var/mob/living/L = target
L.add_modifier(/datum/modifier/entangled, 10 SECONDS)
/obj/item/weapon/gun/energy/rednetgun
name = "experimental capture gun"
desc = "An experimental gun, in efforts to expand net gun technology. Utilizing eletronic interferance and a \
heat aura it in theory stops the subject from fighting back."
icon_state = "goldstunrevolver"
item_state = null
projectile_type = /obj/item/projectile/energy/rednet
charge_cost = 1440 //so a taser has 15 shots at 480 and I want five but this feels goofy
/obj/item/projectile/energy/rednet
name = "expirmental energy net"
icon_state = "toxin"
damage = 0
check_armour = "energy"
hud_state = "pistol_tranq"
fire_sound = 'sound/weapons/Taser.ogg'
nodamage = 1
modifier_type_to_apply = /datum/modifier/rednet
modifier_duration = 0.5 MINUTE
speed = 1.5
/datum/modifier/rednet
mob_overlay_state = "red_electricity_constant"
slowdown = 1
@@ -1,13 +1,13 @@
/obj/item/projectile/mobbola
name = "bola"
icon_state = "bola"
damage = 5
embed_chance = 0 //Nada.
damage_type = HALLOSS
muzzle_type = null
hud_state = "monkey"
combustion = FALSE
modifier_type_to_apply = /datum/modifier/entangled
/obj/item/projectile/mobbola
name = "bola"
icon_state = "bola"
damage = 5
embed_chance = 0 //Nada.
damage_type = HALLOSS
muzzle_type = null
hud_state = "monkey"
combustion = FALSE
modifier_type_to_apply = /datum/modifier/entangled
modifier_duration = 0.5 MINUTE
@@ -1,41 +1,41 @@
/obj/item/weapon/gun/magic/firestaff/vrwizard
name = "hardlight staff"
desc = "A magical staff brimming with energy."
icon = 'icons/obj/wizard.dmi'
icon_state = "staffoffire"
item_state = "staff"
fire_sound = 'sound/weapons/emitter.ogg'
w_class = ITEMSIZE_HUGE
checks_antimagic = FALSE
max_charges = 10
charges = 0
recharge_rate = 2
charge_tick = 0
can_charge = TRUE
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard
/obj/item/weapon/gun/magic/firestaff/vrwizard/fire
description_info = "It will burn the target along with reducing their bleeding."
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/fire
color = "#FF0000"
/obj/item/weapon/gun/magic/firestaff/vrwizard/lighting
description_info = "It will lightly burn targets and open them up to energy based attacks."
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/lighting
color = "#C1F20B"
/obj/item/weapon/gun/magic/firestaff/vrwizard/poison
description_info = "It will heavly poison targets."
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/poison
color = "#003300"
/obj/item/weapon/gun/magic/firestaff/vrwizard/frost
description_info = "Will slow down and minorly poison targets."
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/frost
color = "#00CCFF"
/obj/item/weapon/gun/magic/firestaff/vrwizard/nuclear
description_info = "A high powered staff that burns through energy quickly but unleashes high energy bolts."
projectile_type = /obj/item/projectile/energy/nuclearblast
/obj/item/weapon/gun/magic/firestaff/vrwizard
name = "hardlight staff"
desc = "A magical staff brimming with energy."
icon = 'icons/obj/wizard.dmi'
icon_state = "staffoffire"
item_state = "staff"
fire_sound = 'sound/weapons/emitter.ogg'
w_class = ITEMSIZE_HUGE
checks_antimagic = FALSE
max_charges = 10
charges = 0
recharge_rate = 2
charge_tick = 0
can_charge = TRUE
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard
/obj/item/weapon/gun/magic/firestaff/vrwizard/fire
description_info = "It will burn the target along with reducing their bleeding."
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/fire
color = "#FF0000"
/obj/item/weapon/gun/magic/firestaff/vrwizard/lighting
description_info = "It will lightly burn targets and open them up to energy based attacks."
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/lighting
color = "#C1F20B"
/obj/item/weapon/gun/magic/firestaff/vrwizard/poison
description_info = "It will heavly poison targets."
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/poison
color = "#003300"
/obj/item/weapon/gun/magic/firestaff/vrwizard/frost
description_info = "Will slow down and minorly poison targets."
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/frost
color = "#00CCFF"
/obj/item/weapon/gun/magic/firestaff/vrwizard/nuclear
description_info = "A high powered staff that burns through energy quickly but unleashes high energy bolts."
projectile_type = /obj/item/projectile/energy/nuclearblast
color = "#660066"
+134 -134
View File
@@ -1,135 +1,135 @@
/obj/item/projectile/energy/mob
icon = 'icons/obj/projectiles_impact.dmi'
/obj/item/projectile/energy/mob/heavylaser
name = "heavy laser"
icon_state = "impact_beam_heavy"
fire_sound = 'sound/weapons/lasercannonfire.ogg'
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 25
armor_penetration = 30
light_range = 3
light_power = 1
light_color = "#FF0D00"
/obj/item/projectile/energy/mob/midlaser
name = "laser"
icon_state = "impact_laser"
fire_sound = 'sound/weapons/Laser.ogg'
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 20
armor_penetration = 10
damage_type = BURN
check_armour = "laser"
/obj/item/projectile/energy/mob/smalllaser
name = "laser"
icon_state = "impact_laser"
fire_sound = 'sound/weapons/Laser.ogg'
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 10
armor_penetration = 0
damage_type = BURN
check_armour = "laser"
/obj/item/projectile/energy/mob/drone
name = "laser"
icon_state = "impact_laser"
fire_sound = 'sound/weapons/Laser.ogg'
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 10
damage_type = BURN
check_armour = "laser"
/obj/item/projectile/energy/inversion
name = "inversion blast"
icon = 'icons/obj/projectiles_impact.dmi'
icon_state = "impact_invert"
damage = 15
armor_penetration = 60
damage_type = BURN
check_armour = "laser"
color = "#ffffff"
fire_sound = 'sound/weapons/spiderlunge.ogg'
/obj/item/projectile/energy/mob/electric_spider
name = "stun beam"
icon_state = "impact_stun"
fire_sound = 'sound/weapons/Taser.ogg'
nodamage = 1
taser_effect = 1
damage_type = HALLOSS
light_color = "#FFFFFF"
hitsound = 'sound/weapons/zapbang.ogg'
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
combustion = FALSE
agony = 20
/obj/item/projectile/energy/mob/precursor
name = "precursor beam"
icon = 'icons/obj/projectiles_ch.dmi'
icon_state = "impact_prec"
fire_sound = 'sound/weapons/MediumLaser.ogg'
light_color = "#FF0099"
hud_state = "plasma_rifle"
damage = 25
armor_penetration = 10
//Eclipse mob stuff
/obj/item/projectile/energy/blob/moth
damage = 15
armor_penetration = 15
my_chems = list("fuel", "mold")
flammability = 0.25
modifier_type_to_apply = /datum/modifier/fire
modifier_duration = 6 SECONDS
color = "#38b9ff"
speed = 3.2
/obj/item/projectile/bullet/pistol/medium/ap/eclipse
ricochets = 1
ricochets_max = 8
ricochet_chance = 100
speed = 3.2
/obj/item/projectile/energy/electrode/eclipse
damage = 20
damage_type = BURN
color = "#38b9ff"
speed = 3.2
/obj/item/projectile/arc/fragmentation/moth
name = "solar mortar"
icon_state = "fireball"
fragment_types = list(
/obj/item/projectile/energy/blob/moth, /obj/item/projectile/energy/blob/moth, \
/obj/item/projectile/energy/blob/moth, /obj/item/projectile/energy/blob/moth
)
fragment_amount = 3 // Same as a grenade.
spread_range = 7
/obj/item/projectile/energy/mob/heavysniper
armor_penetration = 40
damage = 40
speed = 1.2
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
name = "sniper beam"
icon_state = "impact_xray"
/obj/item/projectile/energy/declone/burn
damage = 15
nodamage = 0
speed = 3.2
irradiate = 30
/obj/item/projectile/energy/mob/ionbeam
name = "Ion Burst"
damage = 10
damage_type = ELECTROMAG
light_color = "#00CCFF"
icon_state = "impact_blue"
/obj/item/projectile/energy/mob
icon = 'icons/obj/projectiles_impact.dmi'
/obj/item/projectile/energy/mob/heavylaser
name = "heavy laser"
icon_state = "impact_beam_heavy"
fire_sound = 'sound/weapons/lasercannonfire.ogg'
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 25
armor_penetration = 30
light_range = 3
light_power = 1
light_color = "#FF0D00"
/obj/item/projectile/energy/mob/midlaser
name = "laser"
icon_state = "impact_laser"
fire_sound = 'sound/weapons/Laser.ogg'
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 20
armor_penetration = 10
damage_type = BURN
check_armour = "laser"
/obj/item/projectile/energy/mob/smalllaser
name = "laser"
icon_state = "impact_laser"
fire_sound = 'sound/weapons/Laser.ogg'
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 10
armor_penetration = 0
damage_type = BURN
check_armour = "laser"
/obj/item/projectile/energy/mob/drone
name = "laser"
icon_state = "impact_laser"
fire_sound = 'sound/weapons/Laser.ogg'
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 10
damage_type = BURN
check_armour = "laser"
/obj/item/projectile/energy/inversion
name = "inversion blast"
icon = 'icons/obj/projectiles_impact.dmi'
icon_state = "impact_invert"
damage = 15
armor_penetration = 60
damage_type = BURN
check_armour = "laser"
color = "#ffffff"
fire_sound = 'sound/weapons/spiderlunge.ogg'
/obj/item/projectile/energy/mob/electric_spider
name = "stun beam"
icon_state = "impact_stun"
fire_sound = 'sound/weapons/Taser.ogg'
nodamage = 1
taser_effect = 1
damage_type = HALLOSS
light_color = "#FFFFFF"
hitsound = 'sound/weapons/zapbang.ogg'
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
combustion = FALSE
agony = 20
/obj/item/projectile/energy/mob/precursor
name = "precursor beam"
icon = 'icons/obj/projectiles_ch.dmi'
icon_state = "impact_prec"
fire_sound = 'sound/weapons/MediumLaser.ogg'
light_color = "#FF0099"
hud_state = "plasma_rifle"
damage = 25
armor_penetration = 10
//Eclipse mob stuff
/obj/item/projectile/energy/blob/moth
damage = 15
armor_penetration = 15
my_chems = list("fuel", "mold")
flammability = 0.25
modifier_type_to_apply = /datum/modifier/fire
modifier_duration = 6 SECONDS
color = "#38b9ff"
speed = 3.2
/obj/item/projectile/bullet/pistol/medium/ap/eclipse
ricochets = 1
ricochets_max = 8
ricochet_chance = 100
speed = 3.2
/obj/item/projectile/energy/electrode/eclipse
damage = 20
damage_type = BURN
color = "#38b9ff"
speed = 3.2
/obj/item/projectile/arc/fragmentation/moth
name = "solar mortar"
icon_state = "fireball"
fragment_types = list(
/obj/item/projectile/energy/blob/moth, /obj/item/projectile/energy/blob/moth, \
/obj/item/projectile/energy/blob/moth, /obj/item/projectile/energy/blob/moth
)
fragment_amount = 3 // Same as a grenade.
spread_range = 7
/obj/item/projectile/energy/mob/heavysniper
armor_penetration = 40
damage = 40
speed = 1.2
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
name = "sniper beam"
icon_state = "impact_xray"
/obj/item/projectile/energy/declone/burn
damage = 15
nodamage = 0
speed = 3.2
irradiate = 30
/obj/item/projectile/energy/mob/ionbeam
name = "Ion Burst"
damage = 10
damage_type = ELECTROMAG
light_color = "#00CCFF"
icon_state = "impact_blue"
fire_sound = 'sound/weapons/Laser.ogg'
@@ -1,60 +1,60 @@
//Grub
//Spider
//Carp
//Meteroid
//Deathclaw
/decl/chemical_reaction/distilling/energybooster
name = "Distilling Energy Booster"
id = "distill_energybooster"
result = "energybooster"
required_reagents = list("hyperzine" = 1, "stimm" = 1, "shockchem" = 1)
result_amount = 2
reaction_rate = HALF_LIFE(10)
temp_range = list(T0C + 180, T0C + 200)
/decl/chemical_reaction/distilling/oceaniccure
name = "Distilling Oceanic Cure"
id = "distill_oceaniccure"
result = "oceaniccure"
required_reagents = list("curea" = 1, "souldew" = 1, "carpotoxin" = 1)
result_amount = 2
reaction_rate = HALF_LIFE(10)
temp_range = list(T0C + 130, T0C + 150)
/decl/chemical_reaction/distilling/deathclawmutagen
name = "Distilling Deathclaw Mutagen"
id = "distill_deathclawmutagen"
result = "deathclawmutagen"
required_reagents = list("arithrazine" = 1, "mutagen" = 1, "deathblood" = 1)
result_amount = 2
reaction_rate = HALF_LIFE(10)
temp_range = list(T0C + 100, T0C + 120)
/decl/chemical_reaction/distilling/senseenhancer
name = "Distilling Sense Enhancer"
id = "distill_senseenhancer"
result = "senseenhancer"
required_reagents = list("quadcord" = 1, "mindbreaker" = 1, "liquidlife" = 1)
result_amount = 2
reaction_rate = HALF_LIFE(10)
temp_range = list(T0C + 50, T0C + 70)
/decl/chemical_reaction/distilling/heatnullifer
name = "Distilling heatnullifer"
id = "distill_heatnullifer"
result = "heatnullifer"
required_reagents = list("tramadol" = 1, "leporazine" = 1, "spidertoxin" = 1)
result_amount = 2
reaction_rate = HALF_LIFE(10)
//Grub
//Spider
//Carp
//Meteroid
//Deathclaw
/decl/chemical_reaction/distilling/energybooster
name = "Distilling Energy Booster"
id = "distill_energybooster"
result = "energybooster"
required_reagents = list("hyperzine" = 1, "stimm" = 1, "shockchem" = 1)
result_amount = 2
reaction_rate = HALF_LIFE(10)
temp_range = list(T0C + 180, T0C + 200)
/decl/chemical_reaction/distilling/oceaniccure
name = "Distilling Oceanic Cure"
id = "distill_oceaniccure"
result = "oceaniccure"
required_reagents = list("curea" = 1, "souldew" = 1, "carpotoxin" = 1)
result_amount = 2
reaction_rate = HALF_LIFE(10)
temp_range = list(T0C + 130, T0C + 150)
/decl/chemical_reaction/distilling/deathclawmutagen
name = "Distilling Deathclaw Mutagen"
id = "distill_deathclawmutagen"
result = "deathclawmutagen"
required_reagents = list("arithrazine" = 1, "mutagen" = 1, "deathblood" = 1)
result_amount = 2
reaction_rate = HALF_LIFE(10)
temp_range = list(T0C + 100, T0C + 120)
/decl/chemical_reaction/distilling/senseenhancer
name = "Distilling Sense Enhancer"
id = "distill_senseenhancer"
result = "senseenhancer"
required_reagents = list("quadcord" = 1, "mindbreaker" = 1, "liquidlife" = 1)
result_amount = 2
reaction_rate = HALF_LIFE(10)
temp_range = list(T0C + 50, T0C + 70)
/decl/chemical_reaction/distilling/heatnullifer
name = "Distilling heatnullifer"
id = "distill_heatnullifer"
result = "heatnullifer"
required_reagents = list("tramadol" = 1, "leporazine" = 1, "spidertoxin" = 1)
result_amount = 2
reaction_rate = HALF_LIFE(10)
temp_range = list(T0C + 230, T0C + 250)
@@ -1,399 +1,399 @@
/decl/chemical_reaction/instant/drinks/minttea
name = "Mint Tea"
id = "minttea"
result = "minttea"
required_reagents = list("tea" = 5, "mint" = 1)
result_amount = 6
/decl/chemical_reaction/instant/drinks/lemontea
name = "Lemon Tea"
id = "lemontea"
result = "lemontea"
required_reagents = list("tea" = 5, "lemonjuice" = 1)
result_amount = 6
/decl/chemical_reaction/instant/drinks/limetea
name = "Lime Tea"
id = "limetea"
result = "limetea"
required_reagents = list("tea" = 5, "limejuice" = 1)
result_amount = 6
/decl/chemical_reaction/instant/drinks/orangetea
name = "Orange Tea"
id = "orangetea"
result = "orangetea"
required_reagents = list("tea" = 5, "orangejuice" = 1)
result_amount = 6
/decl/chemical_reaction/instant/drinks/berrytea
name = "Berry Tea"
id = "berrytea"
result = "berrytea"
required_reagents = list("tea" = 5, "berryjuice" = 1)
result_amount = 6
/decl/chemical_reaction/instant/drinks/cherrytea
name = "Cherry Tea"
id = "cherrytea"
result = "cherrytea"
required_reagents = list("tea" = 5, "cherryjelly" = 1)
result_amount = 6
/decl/chemical_reaction/instant/drinks/watermelontea
name = "Watermelon Tea"
id = "watermelontea"
result = "watermelontea"
required_reagents = list("tea" = 5, "watermelonjuice" = 1)
result_amount = 6
/decl/chemical_reaction/instant/tea/matcha_latte
id = "matcha_latte"
result = "matcha_latte"
required_reagents = list ("matchapowder" = 1, "milk" = 5)
result_amount = 5
/decl/chemical_reaction/instant/freshtea/green
id = "freshteagreen"
result = "freshteagreen"
required_reagents = list ("tealeavesgreen" = 1, "hotwater" = 9)
result_amount = 10
/decl/chemical_reaction/instant/instantteapowder/green
id = "instantteapowdergreen"
result = "instantteapowdergreen"
required_reagents = list ("teamush" = 10, "frostoil" = 1)
result_amount = 10
/decl/chemical_reaction/instant/instanttea/green
id = "instantteagreen"
result = "instantteagreen"
required_reagents = list ("instantteapowdergreen" = 1, "water" = 9)
result_amount = 10
/decl/chemical_reaction/instant/matcha
id = "matcha"
result = "matcha"
required_reagents = list ("matchapowder" = 1, "hotwater" = 2)
result_amount = 2
/decl/chemical_reaction/instant/drinks/spiderdrink
name = "Brimming glass of spiders"
id = "spiderdrink"
result = "spiderdrink"
required_reagents = list("spidertoxin" = 1, "clonexadone" = 5, "absinthe" = 4)
result_amount = 10
/decl/chemical_reaction/instant/drinks/bubbleteawatermelon
name = "Watermelon bubble tea"
id = "bubbleteawatermelon"
result = "bubbleteawatermelon"
required_reagents = list("gelatin" = 2, "watermelontea" = 6, "milk" = 2)
result_amount = 10
/decl/chemical_reaction/instant/drinks/bubbleteastrawberry
name = "Strawberry bubble tea"
id = "bubbleteastrawberry"
result = "bubbleteastrawberry"
required_reagents = list("gelatin" = 2, "berrytea" = 6, "milk" = 2)
result_amount = 10
/decl/chemical_reaction/instant/drinks/bubbleteacherry
name = "Cherry bubble tea"
id = "bubbleteacherry"
result = "bubbleteacherry"
required_reagents = list("gelatin" = 2, "cherrytea" = 6, "milk" = 2)
result_amount = 10
/decl/chemical_reaction/instant/drinks/bubbleteacoffee
name = "Coffee bubble tea"
id = "bubbleteacoffee"
result = "bubbleteacoffee"
required_reagents = list("gelatin" = 2, "tea" = 5, "cafe_latte" = 3)
result_amount = 10
/decl/chemical_reaction/instant/drinks/bubbleteabanana
name = "Banana bubble tea"
id = "bubbleteabanana"
result = "bubbleteabanana"
required_reagents = list("gelatin" = 2, "tea" = 5, "banana" = 1, "milk" = 2)
result_amount = 10
/decl/chemical_reaction/instant/drinks/horchata
name = "Horchata"
id = "horchata"
result = "horchata"
required_reagents = list("milk" = 1, "sugar" = 2, "rice" = 2)
result_amount = 5
/decl/chemical_reaction/instant/drinks/bluetrain
name = "Blue train"
id = "bluetrain"
result = "bluetrain"
required_reagents = list("coolant" = 2, "ethanol" = 2, "nutriment" = 1)
result_amount = 5
/decl/chemical_reaction/instant/drinks/lowpower
name = "The low power"
id = "lowpower"
result = "lowpower"
required_reagents = list("lemonade" = 1, "cream" = 1, "limejuice" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/jackbrew
name = "Jack's brew"
id = "jackbrew"
result = "jackbrew"
required_reagents = list("irishcoffee" = 1, "hyperzine" = 1)
result_amount = 2
/decl/chemical_reaction/instant/drinks/bookwyrm
name = "Bookwyrm's bite"
id = "bookwyrm"
result = "bookwyrm"
required_reagents = list("coldfront" = 1, "limejuice" = 1, "stoxin" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/highpower
name = "The high power"
id = "highpower"
result = "highpower"
required_reagents = list("lowpower" = 1, "iron" = 1, "uranium" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/flapper
name = "Flapper"
id = "flapper"
result = "flapper"
required_reagents = list("whiskey" = 1, "blood" = 1, "ice" = 1)
result_amount = 3
/decl/chemical_reaction/instant/toxin/oilslide
name = "Oil slide"
id = "oilslide"
result = "oilslide"
required_reagents = list("moonshine" = 1, "lube" = 1, "fuel" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/sitonmyface
name = "Sit on my face"
id = "sitonmyface"
result = "sitonmyface"
required_reagents = list("kahlua" = 1, "irishcream" = 1, "peanutbutter" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/hachi
name = "Hachi"
id = "hachi"
result = "hachi"
required_reagents = list("burbon" = 2, "sake" = 1, "lemonjuice" = 1, "mushroom" = 1) //Whoever coded this never made a mushroom reagent so this can't be created.
result_amount = 5
/decl/chemical_reaction/instant/drinks/narsour
name = "Nar'sour"
id = "narsour"
result = "narsour"
required_reagents = list("blood" = 1, "lemonjuice" = 1, "demonsblood" = 1)
mix_message = "The mixture develops a sinister glow."
reaction_sound = 'sound/effects/singlebeat.ogg'
result_amount = 3
/decl/chemical_reaction/instant/drinks/cogchamp
name = "CogChamp"
id = "cogchamp"
result = "cogchamp"
required_reagents = list("cognac" = 1, "fuel" = 1, "screwdrivercocktail" = 1)
mix_message = "You hear faint sounds of gears turning as the mixture gives off virulent plumes of steam."
reaction_sound = 'sound/machines/clockcult/steam_whoosh.ogg'
result_amount = 3
//thirteen loko possible to make now, so easier to make arachnid slammer - Jack
/decl/chemical_reaction/instant/drinks/thirteenloko
name = "Thirteen Loko"
id = "thirteenloko"
result = "thirteenloko"
required_reagents = list("beer" = 1, "tequilla" = 1, "coffee" = 1)
result_amount = 3
//Arachnid slammer reactions - Jack
/decl/chemical_reaction/instant/drinks/arachnidslammer
name = "Arachnid Slammer"
id = "arachnidslammer"
result = "arachnidslammer"
required_reagents = list("ale" = 1, "thirteenloko" = 1, "hyperzine" = 1)
mix_message = "The concortion of ale, energy drink and stimulants starts to heavily foam and fizzle, even sparkle a little."
result_amount = 3
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
result = "enragedarachnidslammer"
required_reagents = list("infusedarachnidslammer" = 1, "spidertoxin" = 1)
mix_message = "The dormant Arachnid Slammer bubbles and fizzles loudly as it gets enraged by the spider toxin and breaks it down!"
result_amount = 5
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer1
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "cyanide" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer2
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "chloralhydrate" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer3
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "stimm" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer4
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "cryotoxin" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer5
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "cryptobiolin" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer6
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "stoxin" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer7
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "condensedcapsaicin_v" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer8
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "phoron" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer9
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "thermite_v" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer10
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "serotrotium_v" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/pilk
name = "Pilk"
id = "pilk"
result = "pilk"
required_reagents = list("milk" = 1, "cola" = 1)
result_amount = 2
// Drinks from Horizon
/decl/chemical_reaction/instant/drinks/alliescocktail
name = "Allies Cocktail"
id = "alliescocktail"
result = "alliescocktail"
required_reagents = list("martini" = 1, "vodka" = 1)
result_amount = 2
/decl/chemical_reaction/instant/drinks/fetching_fizz
name = "Fetching Fizz"
id = "fetching_fizz"
result = "fetching_fizz"
required_reagents = list("nuka_cola" = 1, "iron" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/hearty_punch
name = "Hearty Punch"
id = "hearty_punch"
result = "hearty_punch"
required_reagents = list("bravebull" = 5, "syndicatebomb" = 5, "absinthe" = 5)
result_amount = 1
/decl/chemical_reaction/instant/drinks/squirt_cider
name = "Squirt Cider"
id = "squirt_cider"
result = "squirt_cider"
required_reagents = list("water" = 1, "tomatojuice" = 1, "nutriment" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/fringe_weaver
name = "Fringe Weaver"
id = "fringe_weaver"
result = "fringe_weaver"
required_reagents = list("ethanol" = 9, "sugar" = 1)
result_amount = 10
/decl/chemical_reaction/instant/drinks/crevice_spike
name = "Crevice Spike"
id = "crevice_spike"
result = "crevice_spike"
required_reagents = list("limejuice" = 2, "capsaicin" = 4)
result_amount = 6
/decl/chemical_reaction/instant/drinks/duplex
name = "Duplex"
id = "duplex"
result = "duplex"
required_reagents = list("cider" = 2, "applejuice" = 1, "berryjuice" = 1)
result_amount = 4
/decl/chemical_reaction/instant/drinks/mauna_loa
name = "Mauna Loa"
id = "mauna_loa"
result = "mauna_loa"
required_reagents = list("capsaicin" = 2, "kahlua" = 1, "bahama_mama" = 2)
result_amount = 5
/decl/chemical_reaction/instant/drinks/hiveminderaser
name = "Hivemind Eraser"
id = "hiveminderaser"
result = "hiveminderaser"
required_reagents = list("blackrussian" = 2, "thirteenloko" = 1, "grenadine" = 1)
result_amount = 4
/decl/chemical_reaction/instant/drinks/erikasurprise
name = "Erika Surprise"
id = "erikasurprise"
result = "erikasurprise"
required_reagents = list("ale" = 2, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1)
result_amount = 6
//YW drinks
/decl/chemical_reaction/instant/drinks/lovepotion_yw
name = "Strawberry Love Potion"
id = "strawberrylovepotion"
result = "strawberrylovepotion"
required_reagents = list("cream" = 1, "berryjuice" = 1, "sugar" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/wormblood
name = "Wormblood"
id = "wormblood"
result = "wormblood"
required_reagents = list("booger" = 1, "psilocybin" = 1)
result_amount = 2
/decl/chemical_reaction/instant/drinks/minttea
name = "Mint Tea"
id = "minttea"
result = "minttea"
required_reagents = list("tea" = 5, "mint" = 1)
result_amount = 6
/decl/chemical_reaction/instant/drinks/lemontea
name = "Lemon Tea"
id = "lemontea"
result = "lemontea"
required_reagents = list("tea" = 5, "lemonjuice" = 1)
result_amount = 6
/decl/chemical_reaction/instant/drinks/limetea
name = "Lime Tea"
id = "limetea"
result = "limetea"
required_reagents = list("tea" = 5, "limejuice" = 1)
result_amount = 6
/decl/chemical_reaction/instant/drinks/orangetea
name = "Orange Tea"
id = "orangetea"
result = "orangetea"
required_reagents = list("tea" = 5, "orangejuice" = 1)
result_amount = 6
/decl/chemical_reaction/instant/drinks/berrytea
name = "Berry Tea"
id = "berrytea"
result = "berrytea"
required_reagents = list("tea" = 5, "berryjuice" = 1)
result_amount = 6
/decl/chemical_reaction/instant/drinks/cherrytea
name = "Cherry Tea"
id = "cherrytea"
result = "cherrytea"
required_reagents = list("tea" = 5, "cherryjelly" = 1)
result_amount = 6
/decl/chemical_reaction/instant/drinks/watermelontea
name = "Watermelon Tea"
id = "watermelontea"
result = "watermelontea"
required_reagents = list("tea" = 5, "watermelonjuice" = 1)
result_amount = 6
/decl/chemical_reaction/instant/tea/matcha_latte
id = "matcha_latte"
result = "matcha_latte"
required_reagents = list ("matchapowder" = 1, "milk" = 5)
result_amount = 5
/decl/chemical_reaction/instant/freshtea/green
id = "freshteagreen"
result = "freshteagreen"
required_reagents = list ("tealeavesgreen" = 1, "hotwater" = 9)
result_amount = 10
/decl/chemical_reaction/instant/instantteapowder/green
id = "instantteapowdergreen"
result = "instantteapowdergreen"
required_reagents = list ("teamush" = 10, "frostoil" = 1)
result_amount = 10
/decl/chemical_reaction/instant/instanttea/green
id = "instantteagreen"
result = "instantteagreen"
required_reagents = list ("instantteapowdergreen" = 1, "water" = 9)
result_amount = 10
/decl/chemical_reaction/instant/matcha
id = "matcha"
result = "matcha"
required_reagents = list ("matchapowder" = 1, "hotwater" = 2)
result_amount = 2
/decl/chemical_reaction/instant/drinks/spiderdrink
name = "Brimming glass of spiders"
id = "spiderdrink"
result = "spiderdrink"
required_reagents = list("spidertoxin" = 1, "clonexadone" = 5, "absinthe" = 4)
result_amount = 10
/decl/chemical_reaction/instant/drinks/bubbleteawatermelon
name = "Watermelon bubble tea"
id = "bubbleteawatermelon"
result = "bubbleteawatermelon"
required_reagents = list("gelatin" = 2, "watermelontea" = 6, "milk" = 2)
result_amount = 10
/decl/chemical_reaction/instant/drinks/bubbleteastrawberry
name = "Strawberry bubble tea"
id = "bubbleteastrawberry"
result = "bubbleteastrawberry"
required_reagents = list("gelatin" = 2, "berrytea" = 6, "milk" = 2)
result_amount = 10
/decl/chemical_reaction/instant/drinks/bubbleteacherry
name = "Cherry bubble tea"
id = "bubbleteacherry"
result = "bubbleteacherry"
required_reagents = list("gelatin" = 2, "cherrytea" = 6, "milk" = 2)
result_amount = 10
/decl/chemical_reaction/instant/drinks/bubbleteacoffee
name = "Coffee bubble tea"
id = "bubbleteacoffee"
result = "bubbleteacoffee"
required_reagents = list("gelatin" = 2, "tea" = 5, "cafe_latte" = 3)
result_amount = 10
/decl/chemical_reaction/instant/drinks/bubbleteabanana
name = "Banana bubble tea"
id = "bubbleteabanana"
result = "bubbleteabanana"
required_reagents = list("gelatin" = 2, "tea" = 5, "banana" = 1, "milk" = 2)
result_amount = 10
/decl/chemical_reaction/instant/drinks/horchata
name = "Horchata"
id = "horchata"
result = "horchata"
required_reagents = list("milk" = 1, "sugar" = 2, "rice" = 2)
result_amount = 5
/decl/chemical_reaction/instant/drinks/bluetrain
name = "Blue train"
id = "bluetrain"
result = "bluetrain"
required_reagents = list("coolant" = 2, "ethanol" = 2, "nutriment" = 1)
result_amount = 5
/decl/chemical_reaction/instant/drinks/lowpower
name = "The low power"
id = "lowpower"
result = "lowpower"
required_reagents = list("lemonade" = 1, "cream" = 1, "limejuice" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/jackbrew
name = "Jack's brew"
id = "jackbrew"
result = "jackbrew"
required_reagents = list("irishcoffee" = 1, "hyperzine" = 1)
result_amount = 2
/decl/chemical_reaction/instant/drinks/bookwyrm
name = "Bookwyrm's bite"
id = "bookwyrm"
result = "bookwyrm"
required_reagents = list("coldfront" = 1, "limejuice" = 1, "stoxin" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/highpower
name = "The high power"
id = "highpower"
result = "highpower"
required_reagents = list("lowpower" = 1, "iron" = 1, "uranium" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/flapper
name = "Flapper"
id = "flapper"
result = "flapper"
required_reagents = list("whiskey" = 1, "blood" = 1, "ice" = 1)
result_amount = 3
/decl/chemical_reaction/instant/toxin/oilslide
name = "Oil slide"
id = "oilslide"
result = "oilslide"
required_reagents = list("moonshine" = 1, "lube" = 1, "fuel" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/sitonmyface
name = "Sit on my face"
id = "sitonmyface"
result = "sitonmyface"
required_reagents = list("kahlua" = 1, "irishcream" = 1, "peanutbutter" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/hachi
name = "Hachi"
id = "hachi"
result = "hachi"
required_reagents = list("burbon" = 2, "sake" = 1, "lemonjuice" = 1, "mushroom" = 1) //Whoever coded this never made a mushroom reagent so this can't be created.
result_amount = 5
/decl/chemical_reaction/instant/drinks/narsour
name = "Nar'sour"
id = "narsour"
result = "narsour"
required_reagents = list("blood" = 1, "lemonjuice" = 1, "demonsblood" = 1)
mix_message = "The mixture develops a sinister glow."
reaction_sound = 'sound/effects/singlebeat.ogg'
result_amount = 3
/decl/chemical_reaction/instant/drinks/cogchamp
name = "CogChamp"
id = "cogchamp"
result = "cogchamp"
required_reagents = list("cognac" = 1, "fuel" = 1, "screwdrivercocktail" = 1)
mix_message = "You hear faint sounds of gears turning as the mixture gives off virulent plumes of steam."
reaction_sound = 'sound/machines/clockcult/steam_whoosh.ogg'
result_amount = 3
//thirteen loko possible to make now, so easier to make arachnid slammer - Jack
/decl/chemical_reaction/instant/drinks/thirteenloko
name = "Thirteen Loko"
id = "thirteenloko"
result = "thirteenloko"
required_reagents = list("beer" = 1, "tequilla" = 1, "coffee" = 1)
result_amount = 3
//Arachnid slammer reactions - Jack
/decl/chemical_reaction/instant/drinks/arachnidslammer
name = "Arachnid Slammer"
id = "arachnidslammer"
result = "arachnidslammer"
required_reagents = list("ale" = 1, "thirteenloko" = 1, "hyperzine" = 1)
mix_message = "The concortion of ale, energy drink and stimulants starts to heavily foam and fizzle, even sparkle a little."
result_amount = 3
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
result = "enragedarachnidslammer"
required_reagents = list("infusedarachnidslammer" = 1, "spidertoxin" = 1)
mix_message = "The dormant Arachnid Slammer bubbles and fizzles loudly as it gets enraged by the spider toxin and breaks it down!"
result_amount = 5
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer1
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "cyanide" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer2
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "chloralhydrate" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer3
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "stimm" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer4
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "cryotoxin" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer5
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "cryptobiolin" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer6
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "stoxin" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer7
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "condensedcapsaicin_v" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer8
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "phoron" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer9
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "thermite_v" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/enragedarachnidslammer10
name = "Enraged Arachnid Slammer"
id = "enragedarachnidslammer"
required_reagents = list("enragedarachnidslammer" = 1, "serotrotium_v" = 1)
result = "enragedarachnidslammer"
result_amount = 0.1
/decl/chemical_reaction/instant/drinks/pilk
name = "Pilk"
id = "pilk"
result = "pilk"
required_reagents = list("milk" = 1, "cola" = 1)
result_amount = 2
// Drinks from Horizon
/decl/chemical_reaction/instant/drinks/alliescocktail
name = "Allies Cocktail"
id = "alliescocktail"
result = "alliescocktail"
required_reagents = list("martini" = 1, "vodka" = 1)
result_amount = 2
/decl/chemical_reaction/instant/drinks/fetching_fizz
name = "Fetching Fizz"
id = "fetching_fizz"
result = "fetching_fizz"
required_reagents = list("nuka_cola" = 1, "iron" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/hearty_punch
name = "Hearty Punch"
id = "hearty_punch"
result = "hearty_punch"
required_reagents = list("bravebull" = 5, "syndicatebomb" = 5, "absinthe" = 5)
result_amount = 1
/decl/chemical_reaction/instant/drinks/squirt_cider
name = "Squirt Cider"
id = "squirt_cider"
result = "squirt_cider"
required_reagents = list("water" = 1, "tomatojuice" = 1, "nutriment" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/fringe_weaver
name = "Fringe Weaver"
id = "fringe_weaver"
result = "fringe_weaver"
required_reagents = list("ethanol" = 9, "sugar" = 1)
result_amount = 10
/decl/chemical_reaction/instant/drinks/crevice_spike
name = "Crevice Spike"
id = "crevice_spike"
result = "crevice_spike"
required_reagents = list("limejuice" = 2, "capsaicin" = 4)
result_amount = 6
/decl/chemical_reaction/instant/drinks/duplex
name = "Duplex"
id = "duplex"
result = "duplex"
required_reagents = list("cider" = 2, "applejuice" = 1, "berryjuice" = 1)
result_amount = 4
/decl/chemical_reaction/instant/drinks/mauna_loa
name = "Mauna Loa"
id = "mauna_loa"
result = "mauna_loa"
required_reagents = list("capsaicin" = 2, "kahlua" = 1, "bahama_mama" = 2)
result_amount = 5
/decl/chemical_reaction/instant/drinks/hiveminderaser
name = "Hivemind Eraser"
id = "hiveminderaser"
result = "hiveminderaser"
required_reagents = list("blackrussian" = 2, "thirteenloko" = 1, "grenadine" = 1)
result_amount = 4
/decl/chemical_reaction/instant/drinks/erikasurprise
name = "Erika Surprise"
id = "erikasurprise"
result = "erikasurprise"
required_reagents = list("ale" = 2, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1)
result_amount = 6
//YW drinks
/decl/chemical_reaction/instant/drinks/lovepotion_yw
name = "Strawberry Love Potion"
id = "strawberrylovepotion"
result = "strawberrylovepotion"
required_reagents = list("cream" = 1, "berryjuice" = 1, "sugar" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/wormblood
name = "Wormblood"
id = "wormblood"
result = "wormblood"
required_reagents = list("booger" = 1, "psilocybin" = 1)
result_amount = 2
File diff suppressed because it is too large Load Diff
@@ -1,66 +1,66 @@
/datum/modifier/eletricalsurge //grub
name = "Eletrical Surge"
desc = "You are filled with an overwhelming energy."
on_created_text = "<span class='critical'>You feel an overwhelimg energy surge through your body!</span>"
on_expired_text = "<span class='notice'>The surge subsides.</span>"
stacks = MODIFIER_STACK_EXTEND
evasion = 20
accuracy = -30
attack_speed_percent = 0.75
siemens_coefficient = 3
/datum/modifier/healingtide //carp
name = "Healing Tide"
desc = "You are filled with an overwhelming energy."
on_created_text = "<span class='critical'>Your body begins to focus on recovering!</span>"
on_expired_text = "<span class='notice'>The healing subsides.</span>"
stacks = MODIFIER_STACK_EXTEND
metabolism_percent = 0.5
incoming_healing_percent = 1.25
/datum/modifier/radiationhide //deathclaw
name = "Radiation Hide"
desc = "Your body defensivly warps."
on_created_text = "<span class='critical'>Your body strangly mutates!</span>"
on_expired_text = "<span class='notice'>Your body returns to normal.</span>"
stacks = MODIFIER_STACK_EXTEND
icon_scale_x_percent = 1.2
icon_scale_y_percent = 1.2
incoming_clone_damage_percent = 0
incoming_healing_percent = 0.5
max_health_percent = 1.5
incoming_damage_percent = 0.9
/datum/modifier/nervoushigh //meteroid
name = "Nervous High"
desc = "Your senses feel everything."
client_color = "#808080" //Za worldo
on_created_text = "<span class='critical'>The world arounds you slows down!</span>"
on_expired_text = "<span class='notice'>The world returns to normal.</span>"
stacks = MODIFIER_STACK_EXTEND
slowdown = -3
attack_speed_percent = 0.25
bleeding_rate_percent = 3.0
metabolism_percent = 3.0
max_health_percent = 0.25
disable_duration_percent = 0.1
/datum/modifier/protectivenumbing //spider
name = "Protective Numbing"
desc = "Your senses feel everything."
on_created_text = "<span class='critical'>Your body becomes numb!</span>"
on_expired_text = "<span class='notice'>Sensation returns to your body.</span>"
stacks = MODIFIER_STACK_EXTEND
heat_protection = 1
cold_protection = 1
/datum/modifier/eletricalsurge //grub
name = "Eletrical Surge"
desc = "You are filled with an overwhelming energy."
on_created_text = "<span class='critical'>You feel an overwhelimg energy surge through your body!</span>"
on_expired_text = "<span class='notice'>The surge subsides.</span>"
stacks = MODIFIER_STACK_EXTEND
evasion = 20
accuracy = -30
attack_speed_percent = 0.75
siemens_coefficient = 3
/datum/modifier/healingtide //carp
name = "Healing Tide"
desc = "You are filled with an overwhelming energy."
on_created_text = "<span class='critical'>Your body begins to focus on recovering!</span>"
on_expired_text = "<span class='notice'>The healing subsides.</span>"
stacks = MODIFIER_STACK_EXTEND
metabolism_percent = 0.5
incoming_healing_percent = 1.25
/datum/modifier/radiationhide //deathclaw
name = "Radiation Hide"
desc = "Your body defensivly warps."
on_created_text = "<span class='critical'>Your body strangly mutates!</span>"
on_expired_text = "<span class='notice'>Your body returns to normal.</span>"
stacks = MODIFIER_STACK_EXTEND
icon_scale_x_percent = 1.2
icon_scale_y_percent = 1.2
incoming_clone_damage_percent = 0
incoming_healing_percent = 0.5
max_health_percent = 1.5
incoming_damage_percent = 0.9
/datum/modifier/nervoushigh //meteroid
name = "Nervous High"
desc = "Your senses feel everything."
client_color = "#808080" //Za worldo
on_created_text = "<span class='critical'>The world arounds you slows down!</span>"
on_expired_text = "<span class='notice'>The world returns to normal.</span>"
stacks = MODIFIER_STACK_EXTEND
slowdown = -3
attack_speed_percent = 0.25
bleeding_rate_percent = 3.0
metabolism_percent = 3.0
max_health_percent = 0.25
disable_duration_percent = 0.1
/datum/modifier/protectivenumbing //spider
name = "Protective Numbing"
desc = "Your senses feel everything."
on_created_text = "<span class='critical'>Your body becomes numb!</span>"
on_expired_text = "<span class='notice'>Sensation returns to your body.</span>"
stacks = MODIFIER_STACK_EXTEND
heat_protection = 1
cold_protection = 1
attack_speed_percent = 1.25
@@ -1,49 +1,49 @@
/datum/reagent/modapplying/energybooster
name = "Energy Booster"
id = "energybooster"
description = "A strange forumla that increases the energy of a consumer."
taste_description = "high voltage"
color = "#FFFF66"
modifier_to_add = /datum/modifier/eletricalsurge
modifier_duration = 3 SECONDS
/datum/reagent/modapplying/oceaniccure
name = "Oceanic Cure"
id = "oceaniccure"
description = "A strange liquid, altering the proprties of other chemicals."
taste_description = "sea breeze"
color = "#C8A5DC"
modifier_to_add = /datum/modifier/healingtide
modifier_duration = 3 SECONDS
/datum/reagent/modapplying/deathclawmutagen
name = "Deathclaw Mutagen"
id = "deathclawmutagen"
description = "An incredibly strange liquid that temporally changes a person's physical form."
taste_description = "buzzing radiation"
color = "#00A000"
modifier_to_add = /datum/modifier/radiationhide
modifier_duration = 3 SECONDS
/datum/reagent/modapplying/senseenhancer
name = "Sense Enhancer"
id = "senseenhancer"
description = "An incredibly strange liquid that allows consumers to see the world in a new light."
taste_description = "blood"
color = "#808080"
modifier_to_add = /datum/modifier/nervoushigh
modifier_duration = 3 SECONDS
/datum/reagent/modapplying/heatnullifer
name = "Heat Nullifer"
id = "heatnullifer"
description = "An incredibly strange liquid that let's consumer's body ignore the effects of tempature."
taste_description = "nothing"
color = "#561EC3"
modifier_to_add = /datum/modifier/protectivenumbing
/datum/reagent/modapplying/energybooster
name = "Energy Booster"
id = "energybooster"
description = "A strange forumla that increases the energy of a consumer."
taste_description = "high voltage"
color = "#FFFF66"
modifier_to_add = /datum/modifier/eletricalsurge
modifier_duration = 3 SECONDS
/datum/reagent/modapplying/oceaniccure
name = "Oceanic Cure"
id = "oceaniccure"
description = "A strange liquid, altering the proprties of other chemicals."
taste_description = "sea breeze"
color = "#C8A5DC"
modifier_to_add = /datum/modifier/healingtide
modifier_duration = 3 SECONDS
/datum/reagent/modapplying/deathclawmutagen
name = "Deathclaw Mutagen"
id = "deathclawmutagen"
description = "An incredibly strange liquid that temporally changes a person's physical form."
taste_description = "buzzing radiation"
color = "#00A000"
modifier_to_add = /datum/modifier/radiationhide
modifier_duration = 3 SECONDS
/datum/reagent/modapplying/senseenhancer
name = "Sense Enhancer"
id = "senseenhancer"
description = "An incredibly strange liquid that allows consumers to see the world in a new light."
taste_description = "blood"
color = "#808080"
modifier_to_add = /datum/modifier/nervoushigh
modifier_duration = 3 SECONDS
/datum/reagent/modapplying/heatnullifer
name = "Heat Nullifer"
id = "heatnullifer"
description = "An incredibly strange liquid that let's consumer's body ignore the effects of tempature."
taste_description = "nothing"
color = "#561EC3"
modifier_to_add = /datum/modifier/protectivenumbing
modifier_duration = 3 SECONDS
@@ -1,36 +1,36 @@
//Chemist expansion
/datum/reagent/toxin/deathblood
name = "Irradiating Blood"
id = "deathblood"
description = "Blood of deathclaw."
taste_description = "plastic"
reagent_state = LIQUID
color = "#CF3600"
strength = 8
/datum/reagent/toxin/liquidfire
name = "Liquid Fire"
id = "liquidfire"
description = "Blood of dragon."
taste_description = "plastic"
reagent_state = LIQUID
color = "#CF3600"
strength = 8
/datum/reagent/toxin/neonliquidfire
name = "Neon Liquid Fire"
id = "neoliquidfire"
description = "Blood of dragon."
taste_description = "plastic"
reagent_state = LIQUID
color = "#CF3600"
strength = 8
/datum/reagent/toxin/liquidlife
name = "Liquid Life"
id = "liquidlife"
description = "Life Drained from a victim, and processed into a liquid form. ."
taste_description = "plastic"
reagent_state = LIQUID
color = "#CF3600"
//Chemist expansion
/datum/reagent/toxin/deathblood
name = "Irradiating Blood"
id = "deathblood"
description = "Blood of deathclaw."
taste_description = "plastic"
reagent_state = LIQUID
color = "#CF3600"
strength = 8
/datum/reagent/toxin/liquidfire
name = "Liquid Fire"
id = "liquidfire"
description = "Blood of dragon."
taste_description = "plastic"
reagent_state = LIQUID
color = "#CF3600"
strength = 8
/datum/reagent/toxin/neonliquidfire
name = "Neon Liquid Fire"
id = "neoliquidfire"
description = "Blood of dragon."
taste_description = "plastic"
reagent_state = LIQUID
color = "#CF3600"
strength = 8
/datum/reagent/toxin/liquidlife
name = "Liquid Life"
id = "liquidlife"
description = "Life Drained from a victim, and processed into a liquid form. ."
taste_description = "plastic"
reagent_state = LIQUID
color = "#CF3600"
strength = 0
+11 -11
View File
@@ -1,12 +1,12 @@
/obj/item/weapon/melee/cullingcane
name = "culling cane"
defend_chance = 15 // The base chance for the weapon to parry.
projectile_parry_chance = 15
sharp = TRUE
edge = TRUE
w_class = ITEMSIZE_LARGE
slot_flags = SLOT_BACK
force = 35
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
can_cleave = TRUE
/obj/item/weapon/melee/cullingcane
name = "culling cane"
defend_chance = 15 // The base chance for the weapon to parry.
projectile_parry_chance = 15
sharp = TRUE
edge = TRUE
w_class = ITEMSIZE_LARGE
slot_flags = SLOT_BACK
force = 35
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
can_cleave = TRUE
icon_state = "scythe0"