mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-23 05:07:51 +01:00
Moar whitespace normalization [MDB IGNORE] (#7750)
Co-authored-by: Raeschen <rycoop29@gmail.com>
This commit is contained in:
@@ -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
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
+297
-297
@@ -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.
|
||||
|
||||
+12
-12
@@ -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)
|
||||
+17
-17
@@ -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
|
||||
+44
-44
@@ -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
|
||||
+312
-312
@@ -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
|
||||
|
||||
+264
-264
@@ -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." ,)
|
||||
|
||||
+219
-219
@@ -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
|
||||
+218
-218
@@ -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)
|
||||
+155
-155
@@ -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)
|
||||
+115
-115
@@ -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." ,)
|
||||
|
||||
|
||||
+127
-127
@@ -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)
|
||||
+392
-392
@@ -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
|
||||
|
||||
+29
-29
@@ -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
|
||||
+132
-132
@@ -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
|
||||
+3
-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
|
||||
+15
-15
@@ -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.
|
||||
+55
-55
@@ -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"
|
||||
+4
-4
@@ -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"
|
||||
+45
-45
@@ -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
|
||||
+134
-134
@@ -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
|
||||
+25
-25
@@ -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
|
||||
+50
-50
@@ -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
+48
-48
@@ -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
|
||||
@@ -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"
|
||||
)
|
||||
|
||||
@@ -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"
|
||||
@@ -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
|
||||
@@ -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"
|
||||
Reference in New Issue
Block a user