mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 18:53:06 +00:00
Anomalous Valley Of Tyr (#9039)
Co-authored-by: Kashargul <KashL@t-online.de> Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
94
modular_chomp/code/datums/crafting/tyr_tribal.dm
Normal file
94
modular_chomp/code/datums/crafting/tyr_tribal.dm
Normal file
@@ -0,0 +1,94 @@
|
||||
/datum/crafting_recipe/arrow_agate
|
||||
name = "Wood arrow (agate tip)"
|
||||
result = /obj/item/arrow/standard
|
||||
reqs = list(list(/obj/item/stack/material/wood = 2),
|
||||
list(/obj/item/stack/material/weathered_agate = 2))
|
||||
time = 40
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_AMMO
|
||||
|
||||
/datum/crafting_recipe/agate_blade
|
||||
name = "agate blade"
|
||||
result = /obj/item/melee/agate_sword
|
||||
reqs = list(list(/obj/item/stack/material/wood = 2),
|
||||
list(/obj/item/stack/material/weathered_agate = 6))
|
||||
time = 40
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/agate_hammer
|
||||
name = "agate hammer"
|
||||
result = /obj/item/melee/agate_hammer
|
||||
reqs = list(list(/obj/item/stack/material/wood = 4),
|
||||
list(/obj/item/stack/material/weathered_agate = 2))
|
||||
time = 40
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/agate_spear
|
||||
name = "agate spear"
|
||||
result = /obj/item/melee/agate_spear
|
||||
reqs = list(list(/obj/item/stack/material/wood = 3),
|
||||
list(/obj/item/stack/material/weathered_agate = 3))
|
||||
time = 40
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/tyr_leaf_cloak
|
||||
name = "tyr leaf cloak"
|
||||
result = /obj/item/clothing/suit/armor/tyrtribalcloak
|
||||
reqs = list(
|
||||
list(/obj/item/reagent_containers/food/snacks/weatherlily = 1),
|
||||
list(/obj/item/stack/material/fiber = 6),
|
||||
list(/obj/item/stack/material/cloth = 3)
|
||||
)
|
||||
time = 120
|
||||
category = CAT_CLOTHING
|
||||
|
||||
//Wierd guns
|
||||
/datum/crafting_recipe/prototype_hilt
|
||||
name = "prototype hilt"
|
||||
result = /obj/item/gun/energy/energyballchain
|
||||
reqs = list(list(/obj/item/stack/material/steel = 12),
|
||||
list(/obj/item/stack/material/plasteel = 6),
|
||||
list(/obj/item/stack/material/weathered_agate = 8),
|
||||
list(/obj/item/prop/alien/prototype = 1)
|
||||
)
|
||||
time = 40
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/prototype_engine
|
||||
name = "prototype engine"
|
||||
result = /obj/item/gun/energy/curse_tyrshotgun
|
||||
reqs = list(list(/obj/item/stack/material/steel = 12),
|
||||
list(/obj/item/stack/material/plasteel = 6),
|
||||
list(/obj/item/stack/material/weathered_agate = 8),
|
||||
list(/obj/item/prop/alien/prototype = 1)
|
||||
)
|
||||
time = 40
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/prototype_core
|
||||
name = "prototype core"
|
||||
result = /obj/item/gun/energy/curse_blaster
|
||||
reqs = list(list(/obj/item/stack/material/steel = 12),
|
||||
list(/obj/item/stack/material/plasteel = 6),
|
||||
list(/obj/item/stack/material/weathered_agate = 8),
|
||||
list(/obj/item/prop/alien/prototype = 1)
|
||||
)
|
||||
time = 40
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/prototype_crystal
|
||||
name = "prototype crystal"
|
||||
result = /obj/item/gun/energy/curse_lasershooter
|
||||
reqs = list(list(/obj/item/stack/material/steel = 12),
|
||||
list(/obj/item/stack/material/plasteel = 6),
|
||||
list(/obj/item/stack/material/weathered_agate = 8),
|
||||
list(/obj/item/prop/alien/prototype = 1)
|
||||
)
|
||||
time = 40
|
||||
category = CAT_WEAPONRY
|
||||
@@ -0,0 +1,38 @@
|
||||
/obj/structure/prop/blackbox/tyr_precursor_a
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/tyr_precursor_a)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/tyr_precursor_a
|
||||
|
||||
/obj/structure/prop/blackbox/tyr_precursor_b
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/tyr_precursor_b)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/tyr_precursor_b
|
||||
|
||||
/obj/structure/prop/blackbox/tyr_precursor_c
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/tyr_precursor_c)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/tyr_precursor_c
|
||||
|
||||
//oooh, shiny
|
||||
/obj/structure/prop/tyr_elevator //This won't function for a while, if ever
|
||||
name = "odd elevator"
|
||||
desc = "A strange metal cylandir. Seems sealed shut."
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
icon_state = "elevator"
|
||||
anchored = TRUE
|
||||
|
||||
/obj/machinery/door/blast/puzzle/tyrdoor
|
||||
name = "strange door"
|
||||
icon = 'modular_chomp/icons/obj/weather_ruins.dmi'
|
||||
|
||||
/obj/machinery/door/blast/puzzle/tyrdoor
|
||||
name = "strange door"
|
||||
icon = 'modular_chomp/icons/obj/weather_ruins.dmi'
|
||||
icon_state_open = "open_door"
|
||||
icon_state_closed = "star_door"
|
||||
icon_state = "star_door"
|
||||
|
||||
/obj/machinery/door/blast/puzzle/tyrdoor/finale
|
||||
name = "strange door"
|
||||
desc = "A strange door. With no way to open it, they will remain shut for quite some time.."
|
||||
icon_state_closed = "final_door"
|
||||
28
modular_chomp/code/game/turfs/simulated/alien.dm
Normal file
28
modular_chomp/code/game/turfs/simulated/alien.dm
Normal file
@@ -0,0 +1,28 @@
|
||||
/turf/simulated/shuttle/wall/alien/orange
|
||||
icon = 'modular_chomp/icons/turf/alien.dmi'
|
||||
icon_state = "alien"
|
||||
base_state = "alien"
|
||||
light_range = 3
|
||||
light_power = 0.75
|
||||
light_color = "#FF3300" // Orangeish?
|
||||
light_on = TRUE
|
||||
|
||||
/turf/simulated/shuttle/wall/alien/orange/Initialize()
|
||||
. = ..()
|
||||
update_light()
|
||||
|
||||
/turf/simulated/shuttle/wall/alien/orange/hard_corner
|
||||
name = "hardcorner wall"
|
||||
icon_state = "alien-hc"
|
||||
hard_corner = 1
|
||||
|
||||
/turf/simulated/shuttle/wall/alien/orange/no_join
|
||||
name = "nojoin wall"
|
||||
icon_state = "alien-nj"
|
||||
join_group = null
|
||||
|
||||
/turf/simulated/wall/quartz
|
||||
icon_state = "hull-r_titanium"
|
||||
|
||||
/turf/simulated/wall/quartz/Initialize(mapload)
|
||||
. = ..(mapload, MAT_QUARTZ, MAT_QUARTZ, MAT_QUARTZ)
|
||||
@@ -5,6 +5,7 @@ GLOBAL_LIST_INIT(shell_module_blacklist, list(
|
||||
GLOBAL_LIST_EMPTY(latejoin_gatewaystation)
|
||||
GLOBAL_LIST_EMPTY(latejoin_plainspath)
|
||||
GLOBAL_LIST_EMPTY(latejoin_fueldepot)
|
||||
GLOBAL_LIST_EMPTY(latejoin_tyrvillage)
|
||||
|
||||
var/list/talk_sound_map = rlist(
|
||||
list(
|
||||
|
||||
@@ -41,3 +41,12 @@
|
||||
/datum/spawnpoint/fueldepot/New()
|
||||
..()
|
||||
turfs = GLOB.latejoin_fueldepot
|
||||
|
||||
/datum/spawnpoint/tyrspawn
|
||||
display_name = "Tyr Wreckage"
|
||||
msg = "woke up in a ruined shuttle"
|
||||
restrict_job = list(JOB_OUTSIDER)
|
||||
|
||||
/datum/spawnpoint/tyrspawn/New()
|
||||
..()
|
||||
turfs = GLOB.latejoin_tyrvillage
|
||||
283
modular_chomp/code/modules/exploration/tyr_tribal_gear.dm
Normal file
283
modular_chomp/code/modules/exploration/tyr_tribal_gear.dm
Normal file
@@ -0,0 +1,283 @@
|
||||
#define MAT_TYRWOOD "petrified wood"
|
||||
#define MAT_WAGATE "weathered agate"
|
||||
//Hello, welcome to the tyr outsider content.
|
||||
//We're going to have some oddities here.
|
||||
//Two-ish tiers. The first tier is made from natural stuff around the caverns.
|
||||
//Tier 2 armor is made from the hides and such from the dangerous wildlife.
|
||||
//Whilst weapons have parts from the wildlife, and the alien ruins.
|
||||
//tier 1
|
||||
//Agate and wood for weapons
|
||||
//cloth and something else is used for armor
|
||||
//tier 2
|
||||
//monster flesh for armor
|
||||
//agate, alien props, and monster bits for weapons.
|
||||
/datum/material/wood/tyr
|
||||
name = MAT_TYRWOOD
|
||||
stack_type = /obj/item/stack/material/wood/tyr
|
||||
icon_colour = "#808080" // grey-ish
|
||||
stack_origin_tech = list(TECH_MATERIAL = 8, TECH_BIO = 2)
|
||||
|
||||
|
||||
/obj/item/stack/material/wood/tyr
|
||||
name = "petrified bark"
|
||||
color = "#808080"
|
||||
default_type = MAT_TYRWOOD
|
||||
|
||||
|
||||
/datum/material/weathered_agate
|
||||
name = MAT_WAGATE
|
||||
display_name = "weathered agate"
|
||||
use_name = "weather agate"
|
||||
icon_colour = "#FF3300"
|
||||
stack_type = /obj/item/stack/material/weathered_agate
|
||||
flags = MATERIAL_UNMELTABLE
|
||||
cut_delay = 60
|
||||
reflectivity = 0
|
||||
conductivity = 1
|
||||
shard_type = SHARD_SHARD
|
||||
tableslam_noise = 'sound/effects/Glasshit.ogg'
|
||||
stack_origin_tech = list(TECH_ARCANE = 1)
|
||||
sheet_singular_name = "gem"
|
||||
sheet_plural_name = "gems"
|
||||
supply_conversion_value = 40 // These are hilariously rare.
|
||||
icon_base = "stone"
|
||||
table_icon_base = "stone"
|
||||
|
||||
|
||||
/obj/item/stack/material/weathered_agate
|
||||
name = "weathered agate"
|
||||
icon_state = "sheet-void_opal"
|
||||
singular_name = "weathered agate"
|
||||
default_type = "weathered agate"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/weatherlily
|
||||
name = "strange leaves"
|
||||
desc = "A strange flower producing an odd substance."
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
icon_state = "leaves"
|
||||
bitesize = 1
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/weatherlily/Initialize()
|
||||
. = ..()
|
||||
//reagents.add_reagent("amatoxin", 1) I want this for lore of this being a strange bioenginered thing to mess with organic things buuuut it's one of two food sources
|
||||
reagents.add_reagent("luminol",1)
|
||||
reagents.add_reagent("protein",1)
|
||||
|
||||
//The source of the materials
|
||||
/obj/structure/outcrop/weathered_gate
|
||||
name = "outcrop"
|
||||
desc = "A boring rocky outcrop."
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
density = TRUE
|
||||
throwpass = 1
|
||||
climbable = TRUE
|
||||
anchored = TRUE
|
||||
icon_state = "outcrop"
|
||||
mindrop = 3
|
||||
upperdrop = 8
|
||||
outcropdrop = /obj/item/stack/material/weathered_agate
|
||||
|
||||
/obj/structure/flora/tyr
|
||||
name = "flora"
|
||||
desc = "A strange plant."
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
|
||||
randomize_size = TRUE
|
||||
|
||||
removal_tool = /obj/item/shovel
|
||||
harvest_tool = /obj/item/material/knife
|
||||
harvest_count = 0
|
||||
destroy_on_harvest = FALSE
|
||||
randomize_harvest_count = FALSE
|
||||
max_harvests = 3
|
||||
harvest_loot = list(/obj/item/stack/material/fiber = 1)
|
||||
|
||||
/obj/structure/flora/tyr/stonetree
|
||||
name = "flora"
|
||||
desc = "A strange plant."
|
||||
icon_state = "stonetree"
|
||||
harvest_loot = list(/obj/item/stack/material/wood/tyr = 1)
|
||||
|
||||
/obj/structure/flora/tyr/lilly
|
||||
name = "flora"
|
||||
desc = "A strange plant."
|
||||
icon_state = "lilly"
|
||||
harvest_loot = list(/obj/item/reagent_containers/food/snacks/weatherlily = 1)
|
||||
|
||||
/obj/structure/flora/tyr/flowers
|
||||
name = "flora"
|
||||
desc = "A strange plant."
|
||||
icon_state = "tyrflora"
|
||||
|
||||
/obj/structure/flora/tyr/flowers/New()
|
||||
..()
|
||||
icon_state = "tyrflora[rand(1, 5)]gb"
|
||||
|
||||
//tier 2
|
||||
/obj/item/reagent_containers/food/snacks/ant
|
||||
name = "ant meat"
|
||||
desc = "A slice from a strange beast"
|
||||
icon_state = "meat"
|
||||
center_of_mass_x = 17 //CHOMPEdit
|
||||
center_of_mass_y= 16 //CHOMPEdit
|
||||
nutriment_amt = 3
|
||||
nutriment_desc = list("protein" = 4)
|
||||
bitesize = 2
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/mutatedmeat/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("protein", 4)
|
||||
|
||||
/obj/item/prop/alien/prototype
|
||||
name = "alien prototype"
|
||||
desc = "You have no idea what this thing does."
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
icon_state = "crystal"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
|
||||
var/static/list/possible_states = list("crystal", "generator","core", "hilt")
|
||||
var/static/list/possible_tech = list(TECH_MATERIAL, TECH_ENGINEERING, TECH_PHORON, TECH_POWER, TECH_BIO, TECH_COMBAT, TECH_MAGNET, TECH_DATA)
|
||||
|
||||
/obj/item/prop/alien/prototype/Initialize()
|
||||
. = ..()
|
||||
icon_state = pick(possible_states)
|
||||
var/list/techs = possible_tech.Copy()
|
||||
origin_tech = list()
|
||||
for(var/i = 1 to rand(1, 4))
|
||||
var/new_tech = pick(techs)
|
||||
techs -= new_tech
|
||||
origin_tech[new_tech] = rand(3, 11)
|
||||
|
||||
origin_tech[TECH_PRECURSOR] = rand(0,3)
|
||||
|
||||
/* Yoinked for refrence
|
||||
/obj/item/arrow/standard
|
||||
name = "arrow"
|
||||
desc = "It's got a tip for you - get the point?"
|
||||
icon = 'icons/obj/guns/projectile/bows.dmi'
|
||||
icon_state = "arrow"
|
||||
item_state = "bolt"
|
||||
throwforce = 8
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
sharp = TRUE
|
||||
edge = FALSE
|
||||
*/
|
||||
|
||||
//So, going to have three/four intended source of damage
|
||||
//Bows,a hammer, and a sword for certian. Debating spear or throwing weapon.
|
||||
//From what I can tell, standard arrows deal 8 damage but have good range although strage ammo and slower
|
||||
//As I type this, just going to go with spear.
|
||||
//Hammer has a slower attack but thwacks harder.
|
||||
//spear gets reach
|
||||
//sword middling damage
|
||||
//Tier 1 gear
|
||||
/obj/item/melee/agate_spear
|
||||
name = "makeshift spear"
|
||||
desc = "A spear made from strange wood and gemstones"
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
icon_state = "agate_spear"
|
||||
force = 12
|
||||
reach = 2
|
||||
/* item_icons = list(
|
||||
slot_l_hand_str = 'modular_chomp/icons/mob/items/lefthand_melee.dmi',
|
||||
slot_r_hand_str = 'modular_chomp/icons/mob/items/righthand_melee.dmi',
|
||||
)*/
|
||||
|
||||
/obj/item/melee/agate_sword
|
||||
name = "makeshift sword"
|
||||
desc = "A sword made from strange wood and gemstones"
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
icon_state = "agate_sword"
|
||||
/* item_icons = list(
|
||||
slot_l_hand_str = 'modular_chomp/icons/mob/items/lefthand_melee.dmi',
|
||||
slot_r_hand_str = 'modular_chomp/icons/mob/items/righthand_melee.dmi',
|
||||
)*/
|
||||
force = 15
|
||||
|
||||
/obj/item/melee/agate_hammer
|
||||
name = "makeshift hammer"
|
||||
desc = "A hammer made from strange wood and gemstones"
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
icon_state = "agate_hammer"
|
||||
/* item_icons = list(
|
||||
slot_l_hand_str = 'modular_chomp/icons/mob/items/lefthand_melee.dmi',
|
||||
slot_r_hand_str = 'modular_chomp/icons/mob/items/righthand_melee.dmi',
|
||||
)*/
|
||||
force = 40
|
||||
attackspeed = 24 //Base attack speed is 8. So this is three times slower. 1 second equals 10.
|
||||
|
||||
/obj/item/clothing/suit/armor/tyrtribalcloak
|
||||
name = "leaf cloak"
|
||||
desc = "A strange cloak made of leaves and fiber. A strange residue resides upon the equipment"
|
||||
slowdown = 0.2
|
||||
icon = 'modular_chomp/icons/mob/tribal_gear.dmi'
|
||||
icon_override = 'modular_chomp/icons/mob/tribal_gear.dmi'
|
||||
icon_state = "lilly_cloak"
|
||||
armor = list(melee = 20, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 60, rad = 60) //Seemingly medicore, but tack on the 20% chance to completly negate something and you get something that is average.
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Head be vunerable but cloak covers the other bits.
|
||||
var/block_chance = 20
|
||||
|
||||
/obj/item/clothing/suit/armor/tyrtribalcloak/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_danger("\The [src] completely deflects [attack_text]!"))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
//Placeholder placing here, but the special items found in the strange vaults of tyr.
|
||||
//Starry Night
|
||||
//ehh either making custom medicells later or some fancy science tool
|
||||
|
||||
|
||||
//Blizzard
|
||||
/obj/item/tool/wirecutters/hybrid/alien
|
||||
toolspeed = 0.2
|
||||
|
||||
/obj/item/tool/wrench/hybrid/alien
|
||||
toolspeed = 0.2
|
||||
|
||||
/obj/item/tool/crowbar/hybrid/alien
|
||||
toolspeed = 0.2
|
||||
|
||||
/obj/item/tool/screwdriver/hybrid/alien
|
||||
toolspeed = 0.2
|
||||
|
||||
/obj/item/weldingtool/experimental/hybrid/alien
|
||||
eye_safety_modifier = 0
|
||||
|
||||
//Rad Storm
|
||||
/obj/item/pickaxe/diamonddrill/alien
|
||||
name = "strane mining drill"
|
||||
icon_state = "diamonddrill"
|
||||
item_state = "jackhammer"
|
||||
digspeed = 6
|
||||
sand_dig = TRUE
|
||||
reach = 3 //proabaly useless but someone may utilize it.
|
||||
color = "#FF3300"
|
||||
|
||||
//Blood Moon
|
||||
/obj/item/melee/energy/sword/dualsaber
|
||||
name = "dual energy sword"
|
||||
desc = "May the force be within you."
|
||||
active_force = 40
|
||||
active_armourpen = 70
|
||||
active_throwforce = 40
|
||||
icon_state = "dualsaber"
|
||||
item_state = "dualsaber"
|
||||
sharp = TRUE
|
||||
edge = TRUE
|
||||
can_cleave = TRUE
|
||||
colorable = TRUE
|
||||
defend_chance = 65
|
||||
|
||||
|
||||
//Five player check
|
||||
/obj/item/shield_projector/rectangle/automatic/tyrvault
|
||||
shield_health = 250
|
||||
max_shield_health = 250
|
||||
shield_regen_delay = 600 SECONDS
|
||||
shield_regen_amount = 50
|
||||
size_x = 4
|
||||
size_y = 4
|
||||
color = "#FF3300"
|
||||
high_color = "#FF3300"
|
||||
low_color = "#F08F4F"
|
||||
@@ -0,0 +1,326 @@
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants
|
||||
name = "metal ant"
|
||||
desc = "A large ant."
|
||||
icon_state = "normal_ant"
|
||||
icon_dead = "dead_ant"
|
||||
maxHealth = 25 //two hits with agate sword, three with spear, one with hammer, four with bow
|
||||
health = 25
|
||||
pass_flags = PASSTABLE
|
||||
movement_cooldown = 1
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative
|
||||
|
||||
see_in_dark = 12
|
||||
melee_damage_lower = 8 //12.5 hits unarmored. 15.625 with the tribal armor
|
||||
melee_damage_upper = 8 //Rng numbers are wierd
|
||||
attack_sharp = TRUE
|
||||
attack_edge = 1
|
||||
|
||||
meat_amount = 3
|
||||
meat_type = /obj/item/reagent_containers/food/snacks/ant
|
||||
|
||||
tame_items = list(/obj/item/reagent_containers/food/snacks/crabmeat = 20)
|
||||
|
||||
faction = FACTION_TYR_ANT
|
||||
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/steel = 6\
|
||||
)
|
||||
|
||||
//I know very little of this
|
||||
swallowTime = 3 SECONDS
|
||||
vore_active = 1
|
||||
vore_capacity = 1
|
||||
vore_bump_chance = 10
|
||||
vore_stomach_name = "Stomach"
|
||||
vore_default_item_mode = IM_DIGEST
|
||||
vore_pounce_chance = 50
|
||||
vore_pounce_cooldown = 10
|
||||
vore_pounce_successrate = 75
|
||||
vore_pounce_falloff = 0
|
||||
vore_pounce_maxhealth = 100
|
||||
vore_standing_too = TRUE
|
||||
unacidable = TRUE
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/init_vore()
|
||||
if(!voremob_loaded) //CHOMPAdd
|
||||
return //CHOMPAdd
|
||||
.=..() //CHOMPEdit
|
||||
var/obj/belly/B = vore_selected
|
||||
B.name = "stomach"
|
||||
B.mode_flags = DM_FLAG_THICKBELLY | DM_FLAG_NUMBING
|
||||
B.digest_brute = 0
|
||||
B.digest_burn = 3
|
||||
B.digestchance = 0
|
||||
B.absorbchance = 0
|
||||
B.escapechance = 25
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/bronze
|
||||
icon_state = "bronze_ant"
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/bronze = 6\
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/copper
|
||||
icon_state = "copper_ant"
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/copper = 6\
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/agate
|
||||
icon_state = "agate_ant"
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/weathered_agate = 6\
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/quartz
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/quartz = 6\
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/painite
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/painite = 6\
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/builder
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/concrete = 6\
|
||||
)
|
||||
nutrition = 150
|
||||
var/build_type = /obj/random/ant_building
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/builder/handle_special()
|
||||
set waitfor = FALSE
|
||||
if(get_AI_stance() == STANCE_IDLE && !is_AI_busy() && isturf(loc))
|
||||
build_tile(loc)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/builder/proc/build_tile(turf/T)
|
||||
if(nutrition < 75)
|
||||
return FALSE
|
||||
if(!istype(T))
|
||||
return FALSE
|
||||
|
||||
var/obj/effect/ant_structure/W = locate() in T
|
||||
if(W)
|
||||
return FALSE // Already got webs here.
|
||||
|
||||
visible_message(span_notice("\The [src] begins to secrete a sticky substance."))
|
||||
// Get our AI to stay still.
|
||||
set_AI_busy(TRUE)
|
||||
|
||||
if(!do_mob(src, T, 5 SECONDS))
|
||||
set_AI_busy(FALSE)
|
||||
to_chat(src, span_warning("You need to stay still to spin a web on \the [T]."))
|
||||
return FALSE
|
||||
|
||||
W = locate() in T
|
||||
if(W)
|
||||
return FALSE // Spamclick protection.
|
||||
|
||||
adjust_nutrition(-30)
|
||||
set_AI_busy(FALSE)
|
||||
new build_type(T)
|
||||
return TRUE
|
||||
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/queen //There will only be two queens on the map, and the source of further ants. Farming dies if they die.
|
||||
name = "queen ant"
|
||||
icon_state = "queen_ant"
|
||||
maxHealth = 60 //four hits with agate sword, five with spear, two with hammer, eight with bow
|
||||
health = 60
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/valhollide = 4\
|
||||
)
|
||||
nutrition = 480
|
||||
var/build_type = /obj/effect/spider/spiderling/antling
|
||||
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/queen/handle_special()
|
||||
set waitfor = FALSE
|
||||
if(get_AI_stance() == STANCE_IDLE && !is_AI_busy() && isturf(loc))
|
||||
build_tile(loc)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/queen/proc/build_tile(turf/T)
|
||||
if(nutrition < 30)
|
||||
return FALSE
|
||||
if(!istype(T))
|
||||
return FALSE
|
||||
|
||||
var/obj/effect/ant_structure/W = locate() in T
|
||||
if(W)
|
||||
return FALSE // Already got webs here.
|
||||
|
||||
visible_message(span_notice("\The [src] begins to secrete a sticky substance."))
|
||||
// Get our AI to stay still.
|
||||
set_AI_busy(TRUE)
|
||||
|
||||
if(!do_mob(src, T, 5 SECONDS))
|
||||
set_AI_busy(FALSE)
|
||||
to_chat(src, span_warning("You need to stay still to spin a web on \the [T]."))
|
||||
return FALSE
|
||||
|
||||
W = locate() in T
|
||||
if(W)
|
||||
return FALSE // Spamclick protection.
|
||||
|
||||
adjust_nutrition(-75)
|
||||
set_AI_busy(FALSE)
|
||||
new build_type(T)
|
||||
return TRUE
|
||||
|
||||
/*
|
||||
ANT STRUCTURES
|
||||
*/
|
||||
|
||||
/obj/structure/mob_spawner/ant_hill
|
||||
name = "ant hole"
|
||||
desc = "An entrance to the nest of metallic ants."
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
icon_state = "hole"
|
||||
anchored = TRUE
|
||||
|
||||
spawn_delay = 10 MINUTES
|
||||
|
||||
spawn_types = list(
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants = 1,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/bronze = 1,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/copper = 1,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/agate = 3,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/quartz = 1,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/painite = 1,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/builder = 1
|
||||
)
|
||||
|
||||
simultaneous_spawns = 5
|
||||
|
||||
destructible = 1
|
||||
health = 50 //Unsure why you would want to break it but you can
|
||||
|
||||
|
||||
/obj/effect/ant_structure
|
||||
name = "organic structure"
|
||||
desc = "A creation of metal ants."
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
icon_state = "hole"
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
var/health = 15 //1 thwack with sword, 2 with spear
|
||||
|
||||
/obj/effect/ant_structure/attackby(var/obj/item/W, var/mob/user)
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
|
||||
if(LAZYLEN(W.attack_verb))
|
||||
visible_message(span_warning("\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]"))
|
||||
else
|
||||
visible_message(span_warning("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]"))
|
||||
|
||||
var/damage = W.force / 4.0
|
||||
|
||||
if(W.has_tool_quality(TOOL_WELDER))
|
||||
var/obj/item/weldingtool/WT = W.get_welder()
|
||||
|
||||
if(WT.remove_fuel(0, user))
|
||||
damage = 15
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
|
||||
health -= damage
|
||||
healthcheck()
|
||||
|
||||
|
||||
/obj/effect/ant_structure/bullet_act(var/obj/item/projectile/Proj)
|
||||
..()
|
||||
health -= Proj.get_structure_damage()
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/ant_structure/proc/die()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/ant_structure/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
die()
|
||||
/obj/effect/ant_structure/trap
|
||||
name = "spore trap"
|
||||
var/modifiertype = /datum/modifier/berserk
|
||||
|
||||
/obj/effect/ant_structure/trap/Crossed(atom/movable/AM as mob|obj)
|
||||
if(AM.is_incorporeal())
|
||||
return
|
||||
if(anchored && isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
if(L == /mob/living/simple_mob/animal/tyr/mineral_ants)
|
||||
return
|
||||
else if(L.m_intent == "run")
|
||||
L.visible_message(
|
||||
span_danger("[L] steps in \the [src]."),
|
||||
span_danger("You step in \the [src]!"),
|
||||
"<b>You hear a strange rustling!</b>"
|
||||
)
|
||||
attack_mob(L)
|
||||
update_icon()
|
||||
..()
|
||||
|
||||
/obj/effect/ant_structure/trap/proc/attack_mob(mob/living/L)
|
||||
L.add_modifier(modifiertype, 5 SECONDS)
|
||||
|
||||
/obj/effect/ant_structure/trap/knockdown
|
||||
icon_state = "knock_trap"
|
||||
modifiertype = /datum/modifier/poisoned
|
||||
|
||||
/obj/effect/ant_structure/trap/burn
|
||||
icon_state = "burn_trap"
|
||||
modifiertype = /datum/modifier/fire/weak
|
||||
|
||||
/obj/effect/ant_structure/trap/slowdown
|
||||
icon_state = "slow_trap"
|
||||
modifiertype = /datum/modifier/chilled
|
||||
|
||||
/obj/effect/ant_structure/wall
|
||||
name = "Metant wall"
|
||||
icon_state = "wall"
|
||||
density = TRUE
|
||||
health = 25 //two hits with sword.
|
||||
|
||||
/obj/random/ant_building
|
||||
name = "ant stucture"
|
||||
desc = "This is a metant build"
|
||||
icon_state = "tool"
|
||||
|
||||
/obj/random/ant_building/item_to_spawn()
|
||||
return pick(/obj/effect/ant_structure/wall,
|
||||
/obj/effect/ant_structure/trap/burn,
|
||||
/obj/effect/ant_structure/trap/knockdown,
|
||||
/obj/effect/ant_structure/trap/slowdown)
|
||||
|
||||
|
||||
/obj/effect/spider/spiderling/antling
|
||||
name = "antling"
|
||||
desc = "A tiny ant."
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
icon_state = "antling"
|
||||
anchored = FALSE
|
||||
layer = HIDING_LAYER
|
||||
health = 3
|
||||
grow_as = list(/mob/living/simple_mob/animal/tyr/mineral_ants,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/bronze,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/copper,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/agate,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/quartz,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/painite,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/builder)
|
||||
faction = FACTION_TYR
|
||||
|
||||
/obj/effect/ant_structure/webbarrier
|
||||
name = "weblike barrier"
|
||||
icon_state = "web"
|
||||
|
||||
/obj/effect/ant_structure/webbarrier/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover, /mob/living/simple_mob/animal/giant_spider))
|
||||
return TRUE
|
||||
else if(istype(mover, /mob/living))
|
||||
if(prob(80))
|
||||
to_chat(mover, span_warning("You get stuck in \the [src] for a moment."))
|
||||
return FALSE
|
||||
else if(istype(mover, /obj/item/projectile))
|
||||
return prob(30)
|
||||
return TRUE
|
||||
@@ -0,0 +1,182 @@
|
||||
/mob/living/simple_mob/animal/tyr/rainbow_fly
|
||||
name = "chromatic fly"
|
||||
desc = "A strange insect."
|
||||
icon_state = "firefly"
|
||||
icon_dead = "firefly_dead"
|
||||
maxHealth = 10 //Not sure why you're fighting this, but any agate weapon one shots it. Except bow.
|
||||
health = 10
|
||||
pass_flags = PASSTABLE
|
||||
movement_cooldown = 1
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/passive
|
||||
|
||||
glow_color = "#FF3300"
|
||||
light_color = "#FF3300"
|
||||
glow_range = 4
|
||||
glow_intensity = 4
|
||||
|
||||
melee_damage_lower = 5 //I guess it could theortically kill you dirrectly
|
||||
melee_damage_upper = 5
|
||||
|
||||
hovering = TRUE
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/rainbow_fly/handle_special()
|
||||
if(stat != DEAD)
|
||||
painbow_aura()
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/rainbow_fly/proc/painbow_aura()
|
||||
for(var/mob/living/L in view(src, 4))
|
||||
L.druggy = max(L.druggy, 10)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/groundpitcher
|
||||
name = "underground pitcher"
|
||||
desc = "A large insect."
|
||||
icon_state = "groundpitcher"
|
||||
icon_dead = "groundpitcher"
|
||||
maxHealth = 20 //two hits with sword and spear..
|
||||
health = 20
|
||||
pass_flags = PASSTABLE //This was from me copy and pasting but...it's an unmoving plant. Kind of want to keep it here.
|
||||
movement_cooldown = 1
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/passive/pitcher
|
||||
|
||||
melee_damage_lower = 0 //This cannot kill you unless you fall into it
|
||||
melee_damage_upper = 0
|
||||
|
||||
meat_type = /obj/item/stack/material/fiber
|
||||
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/cloth = 1\
|
||||
)
|
||||
|
||||
vore_bump_chance = 100
|
||||
vore_bump_emote = "slurps up" //Not really a good way to make the grammar work with a passive vore plant.
|
||||
vore_active = 1
|
||||
vore_capacity = 1
|
||||
vore_pounce_chance = 0 //Plants only eat people who stumble into them.
|
||||
swallowTime = 3 //3 deciseconds. This is intended to be nearly instant, e.g. victim trips and falls in.
|
||||
vore_ignores_undigestable = 0
|
||||
vore_default_mode = DM_DIGEST
|
||||
|
||||
//This is legit pitcher plant bellies with slightly altered bits.
|
||||
/mob/living/simple_mob/animal/tyr/groundpitcher/init_vore()
|
||||
if(!voremob_loaded)
|
||||
return
|
||||
.=..()
|
||||
var/obj/belly/B = vore_selected
|
||||
B.desc = "You leaned a little too close to the pitcher plant, stumbling over the lip and splashing into a puddle of liquid filling the bottom of the cramped pitcher. You squirm madly, righting yourself and scrabbling at the walls in vain as the slick surface offers no purchase. The dim light grows dark as the pitcher's cap lowers, silently sealing the exit. With a sinking feeling you realize you won't be able to push the exit open even if you could somehow climb that high, leaving you helplessly trapped in the slick, tingling fluid."
|
||||
B.digest_burn = 0.5
|
||||
B.digest_brute = 0
|
||||
B.vore_verb = "trip"
|
||||
B.name = "pitcher"
|
||||
B.mode_flags = DM_FLAG_THICKBELLY
|
||||
B.wet_loop = 0 //As nice as the fancy internal sounds are this is a plant.
|
||||
B.digestchance = 20
|
||||
B.escapechance = 20
|
||||
B.fancy_vore = 1
|
||||
B.vore_sound = "Squish2"
|
||||
B.release_sound = "Pred Escape"
|
||||
B.contamination_color = "purple"
|
||||
B.contamination_flavor = "Wet"
|
||||
//Why is it we have all these customizeable belly options which nobody ever alters for mobs?
|
||||
|
||||
B.emote_lists[DM_HOLD] = list(
|
||||
"Slick fluid trickles over you, carrying threads of sweetness.",
|
||||
"Everything is still, dark, and quiet. Your breaths echo quietly.",
|
||||
"The surrounding air feels thick and humid.")
|
||||
|
||||
B.emote_lists[DM_DIGEST] = list(
|
||||
"The slimy puddle stings faintly. It seems the plant has no need to quickly break down victims.",
|
||||
"The humid air settles in your lungs, keeping each breath more labored than the last.",
|
||||
"Fluid drips onto you, burning faintly as your body heat warms it."
|
||||
)
|
||||
|
||||
B.emote_lists[DM_DRAIN] = list(
|
||||
"Each bead of slick fluid running down your body leaves you feeling weaker.",
|
||||
"It's cramped and dark, the air thick and heavy. Your limbs feel like lead.",
|
||||
"Strength drains from your frame. The cramped chamber feels easier to settle into with each passing moment.")
|
||||
|
||||
//Preadtory Things
|
||||
/obj/structure/mob_spawner/beetle_hill
|
||||
name = "beetle tunnel"
|
||||
desc = "An entrance to the nest of metallic ants."
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
icon_state = "hole"
|
||||
anchored = TRUE
|
||||
|
||||
spawn_delay = 10 MINUTES
|
||||
|
||||
spawn_types = list(
|
||||
/mob/living/simple_mob/animal/tyr/electronic_beetle = 1,
|
||||
/mob/living/simple_mob/animal/tyr/explode_beetle = 1,
|
||||
)
|
||||
|
||||
simultaneous_spawns = 2
|
||||
|
||||
destructible = 1
|
||||
health = 50
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/electronic_beetle
|
||||
name = "charged beetle"
|
||||
desc = "A large insect."
|
||||
icon_state = "lighting_beetle"
|
||||
icon_dead = "beetle_dead"
|
||||
maxHealth = 40
|
||||
health = 40
|
||||
pass_flags = PASSTABLE //flying bug
|
||||
movement_cooldown = 1
|
||||
|
||||
meat_type = /obj/item/reagent_containers/food/snacks/meat/grubmeat
|
||||
meat_amount = 2
|
||||
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/chitin = 1\
|
||||
)
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
|
||||
|
||||
see_in_dark = 3
|
||||
melee_damage_lower = 12 //Kills you 8ish if unarmored, or 10ish if wearing the tribal armor
|
||||
melee_damage_upper = 12 //Rng numbers are wierd
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/electronic_beetle/apply_melee_effects(var/atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
A.emp_act(4) //The weakest strength of EMP
|
||||
playsound(src, 'sound/weapons/Egloves.ogg', 75, 1)
|
||||
L.Weaken(4)
|
||||
L.Stun(4)
|
||||
L.stuttering = max(L.stuttering, 4)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, L)
|
||||
s.start()
|
||||
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/explode_beetle
|
||||
name = "fiery beetle"
|
||||
desc = "A large insect."
|
||||
icon_state = "fire_beetle"
|
||||
icon_dead = "beetle_dead"
|
||||
maxHealth = 40
|
||||
health = 40
|
||||
pass_flags = PASSTABLE //flying bug
|
||||
movement_cooldown = 1
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
|
||||
|
||||
meat_type = /obj/item/reagent_containers/food/snacks/carpmeat
|
||||
meat_amount = 2
|
||||
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/chitin = 1\
|
||||
)
|
||||
|
||||
see_in_dark = 3
|
||||
melee_damage_lower = 6 //Kills you 8ish if unarmored, or 10ish if wearing the tribal armor
|
||||
melee_damage_upper = 6 //Rng numbers are wierd
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/explode_beetle/apply_melee_effects(var/atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
L.add_modifier(/datum/modifier/fire, 3 SECONDS)
|
||||
@@ -0,0 +1,42 @@
|
||||
/mob/living/simple_mob/animal/tyr
|
||||
minbodytemp = 175
|
||||
maxbodytemp = 500
|
||||
cold_resist = -0.5
|
||||
heat_resist = 0.75
|
||||
|
||||
see_in_dark = 3 //stealth time?
|
||||
|
||||
icon = 'modular_chomp/icons/mob/tyr.dmi'
|
||||
|
||||
faction = FACTION_TYR
|
||||
|
||||
can_be_drop_prey = FALSE
|
||||
can_be_drop_pred = TRUE
|
||||
|
||||
//I know very little of this and yes, I copy and pasted from ants
|
||||
swallowTime = 3 SECONDS
|
||||
vore_active = 1
|
||||
vore_capacity = 1
|
||||
vore_bump_chance = 10
|
||||
vore_stomach_name = "Stomach"
|
||||
vore_default_item_mode = IM_DIGEST
|
||||
vore_pounce_chance = 50
|
||||
vore_pounce_cooldown = 10
|
||||
vore_pounce_successrate = 75
|
||||
vore_pounce_falloff = 0
|
||||
vore_pounce_maxhealth = 100
|
||||
vore_standing_too = TRUE
|
||||
unacidable = TRUE
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/init_vore()
|
||||
if(!voremob_loaded) //CHOMPAdd
|
||||
return //CHOMPAdd
|
||||
.=..() //CHOMPEdit
|
||||
var/obj/belly/B = vore_selected
|
||||
B.name = "stomach"
|
||||
B.mode_flags = DM_FLAG_THICKBELLY | DM_FLAG_NUMBING
|
||||
B.digest_brute = 1
|
||||
B.digest_burn = 1
|
||||
B.digestchance = 0
|
||||
B.absorbchance = 0
|
||||
B.escapechance = 25
|
||||
@@ -14,7 +14,7 @@
|
||||
icon_gib = "syndicate_gib"
|
||||
taser_kill = 0
|
||||
|
||||
faction = "eclipse"
|
||||
faction = FACTION_ECLIPSE
|
||||
movement_cooldown = 0
|
||||
|
||||
status_flags = 0
|
||||
@@ -108,8 +108,8 @@
|
||||
name = "Solar Eclipse Initiate"
|
||||
desc = "You shouldn't be seeing this. But don't use lasers or energy weapons"
|
||||
|
||||
armor = list(melee = -50, bullet = -50, laser = 0, energy = 0, bomb = 50, bio = 100, rad = 100) //Solar members are nigh immune to burns.
|
||||
armor_soak = list(melee = 0, bullet = 0, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
armor = list(melee = -100, bullet = -100, laser = 30, energy = 30, bomb = 50, bio = 100, rad = 100) //Solar members are nigh immune to burns.
|
||||
armor_soak = list(melee = 0, bullet = 0, laser = 18, energy = 18, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/bullet_act(obj/item/projectile/P)
|
||||
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
|
||||
@@ -231,7 +231,7 @@
|
||||
try_reload()
|
||||
return FALSE
|
||||
|
||||
visible_message("<span class='danger'><b>\The [src]</b> fires at \the [orig_targ]!</span>")
|
||||
visible_message(span_danger("<b>\The [src]</b> fires at \the [orig_targ]!"))
|
||||
shoot(A)
|
||||
if(casingtype)
|
||||
new casingtype(loc)
|
||||
@@ -279,8 +279,8 @@
|
||||
name = "Lunar Eclipse Initiate"
|
||||
desc = "You shouldn't be seeing this, but don't use melee weapons or bullets."
|
||||
|
||||
armor = list(melee = 0, bullet = 0, laser = -50, energy = -50, bomb = 50, bio = 100, rad = 100) //Lunar members are nigh immune to burns.
|
||||
armor_soak = list(melee = 10, bullet = 10, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) //15 because every melee weapon has dumb amount of AP
|
||||
armor = list(melee = 30, bullet = 30, laser = -100, energy = -100, bomb = 50, bio = 100, rad = 100) //Lunar members are nigh immune to burns.
|
||||
armor_soak = list(melee = 18, bullet = 18, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) //15 because every melee weapon has dumb amount of AP
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/bullet_act(obj/item/projectile/P)
|
||||
if(istype(P, /obj/item/projectile/bullet))
|
||||
@@ -290,58 +290,14 @@
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
to_chat(user, "<span class='warning'>This weapon is ineffective, it does no damage.</span>")
|
||||
to_chat(user, span_warning("This weapon is ineffective, it does no damage."))
|
||||
.=..()
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/silvernoodle //Bouncing bullet extreme
|
||||
name = "Lunar Eclipse Silver Serpent"
|
||||
desc = "A hungry looking naga, their strange armor protecting them from ballistics and physical weaponry."
|
||||
health = 100 //Old 40
|
||||
maxHealth = 100
|
||||
reload_max = 6
|
||||
movement_cooldown = 1
|
||||
|
||||
icon_state = "eclipse_silver"
|
||||
icon_living = "eclipse_silver"
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/pistol/medium/ap/eclipse
|
||||
|
||||
var/grenade_type = /obj/item/grenade/chem_grenade/teargas
|
||||
var/grenade_timer = 20
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/silvernoodle/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/humanoid/eclipse/lunar/silvernoodle/do_special_attack(atom/A)
|
||||
set waitfor = FALSE
|
||||
set_AI_busy(TRUE)
|
||||
|
||||
var/obj/item/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)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/shotgunner //wuff with shotgun
|
||||
name = "Lunar Eclipse Shotgunner"
|
||||
desc = "A Vulpkanin or the like in a red-purple flashing rigsuit, it defending them from physical damage of close and long ranges."
|
||||
health = 75 //old 40
|
||||
maxHealth = 75
|
||||
health = 40
|
||||
maxHealth = 40
|
||||
reload_max = 1
|
||||
|
||||
icon_state = "eclipse_shotwuff"
|
||||
@@ -377,7 +333,7 @@
|
||||
try_reload()
|
||||
return FALSE
|
||||
|
||||
visible_message("<span class='danger'><b>\The [src]</b> fires at \the [orig_targ]!</span>")
|
||||
visible_message(span_danger("<b>\The [src]</b> fires at \the [orig_targ]!"))
|
||||
shoot(A)
|
||||
if(casingtype)
|
||||
new casingtype(loc)
|
||||
@@ -533,7 +489,7 @@
|
||||
// Does actual poison injection, after all checks passed.
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/hellhound/proc/inject_poison(mob/living/L, target_zone)
|
||||
if(prob(poison_chance))
|
||||
to_chat(L, "<span class='warning'>You feel a tiny prick.</span>")
|
||||
to_chat(L, span_warning("You feel a tiny prick."))
|
||||
L.reagents.add_reagent(poison_type, poison_per_bite)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/ravanger/apply_melee_effects(var/atom/A)
|
||||
@@ -547,7 +503,7 @@
|
||||
// Does actual poison injection, after all checks passed.
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/ravanger/proc/inject_poison(mob/living/L, target_zone)
|
||||
if(prob(poison_chance))
|
||||
to_chat(L, "<span class='warning'>You feel a tiny prick.</span>")
|
||||
to_chat(L, span_warning("You feel a tiny prick."))
|
||||
L.reagents.add_reagent(poison_type, poison_per_bite)
|
||||
|
||||
|
||||
@@ -606,7 +562,7 @@
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, L)
|
||||
s.start()
|
||||
visible_message("<span class='danger'>The pummler releases a powerful shock!</span>")
|
||||
visible_message(span_danger("The pummler releases a powerful shock!"))
|
||||
else
|
||||
return
|
||||
|
||||
@@ -690,7 +646,7 @@
|
||||
try_reload()
|
||||
return FALSE
|
||||
|
||||
visible_message("<span class='danger'><b>\The [src]</b> fires at \the [orig_targ]!</span>")
|
||||
visible_message(span_danger("<b>\The [src]</b> fires at \the [orig_targ]!"))
|
||||
shoot(A)
|
||||
if(casingtype)
|
||||
new casingtype(loc)
|
||||
@@ -726,67 +682,6 @@
|
||||
maxHealth = 1
|
||||
faction = "eclipse"
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/froststalker //teleporting stalker
|
||||
name = "Solar Eclipse Froststalker"
|
||||
health = 30
|
||||
maxHealth = 30
|
||||
desc = "A somewhat see through being wearing a burn resistaint coat."
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 20
|
||||
attack_armor_pen = 30
|
||||
special_attack_cooldown = 25 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
projectiletype = null
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
icon_state = "froststalker"
|
||||
icon_living = "froststalker"
|
||||
cold_resist = 1.0
|
||||
melee_attack_delay = 2.5
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/froststalker/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/smoke_spread/frost
|
||||
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()
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/cryomancer //Freezing slowdown unit
|
||||
name = "Solar Eclipse Cryomancer"
|
||||
desc = "A being wearing ice and burn resistaint armor."
|
||||
@@ -889,3 +784,259 @@
|
||||
dying_threshold = 0.3 // How low on health the holder needs to be before fleeing. Defaults to 30% or lower health.
|
||||
flee_when_outmatched = TRUE // If they should flee upon reaching a specific tension threshold.
|
||||
outmatched_threshold = 300
|
||||
|
||||
//Some new eclipse folks for tyr, although one is a rework of the exsisting naga
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/disablernoodle //If you have a Nif, or are a borg you get hit with confusion and adds Edit, can't currently figure out NIF targeting
|
||||
name = "Solar Eclipse Disabler Serpent"
|
||||
desc = "A naga cladded in strange orange armor, seemingly guarded from lasers and energy based weaponry."
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
icon_state = "eclipse_disabler"
|
||||
icon_living = "eclipse_disabler"
|
||||
reload_max = 5
|
||||
movement_cooldown = 1
|
||||
|
||||
special_attack_cooldown = 30 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
|
||||
projectiletype = /obj/item/projectile/energy/electrode
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/disablernoodle/do_special_attack(atom/A)
|
||||
visible_message(span_critical("\The [src] pulls out a flash!"))
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
if(C.stat != DEAD)
|
||||
var/safety = C.eyecheck()
|
||||
if(safety <= 0)
|
||||
var/flash_strength = 8
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
flash_strength *= H.species.flash_mod
|
||||
if(flash_strength > 0)
|
||||
to_chat(H, span_critical("You are disoriented by \the [src]!"))
|
||||
H.eye_blurry = max(H.eye_blurry, flash_strength + 5)
|
||||
H.flash_eyes()
|
||||
H.apply_damage(flash_strength * H.species.flash_burn/5, BURN, BP_HEAD, 0, 0, "Photon burns")
|
||||
|
||||
else if(issilicon(L))
|
||||
if(isrobot(L))
|
||||
var/flashfail = FALSE
|
||||
var/mob/living/silicon/robot/R = L
|
||||
if(!flashfail)
|
||||
to_chat(R, span_critical("Your optics are scrambled by \the [src]!"))
|
||||
R.Confuse(10)
|
||||
R.flash_eyes()
|
||||
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/silvernoodle //Bouncing bullet extreme
|
||||
name = "Lunar Eclipse Silver Serpent"
|
||||
desc = "A hungry looking naga, their strange armor protecting them from ballistics and physical weaponry."
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
reload_max = 6
|
||||
movement_cooldown = 1
|
||||
|
||||
icon_state = "eclipse_silver"
|
||||
icon_living = "eclipse_silver"
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/pistol/medium
|
||||
special_attack_cooldown = 30 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/disablernoodle/do_special_attack(atom/A) //I am bringing back the netgun attack. 4 seconds
|
||||
visible_message(span_warning("\The [src] begins to create an energy net!"))
|
||||
Beam(A, icon_state = "sat_beam", time = 3 SECONDS, maxdistance = INFINITY)
|
||||
sleep(40)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/beam/energy_net(get_turf(src))
|
||||
P.launch_projectile(A, BP_TORSO, src)
|
||||
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/plant
|
||||
name = "Solar Eclipse Bioexpirment"
|
||||
desc = "A strange armored looking plant."
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
reload_max = 6
|
||||
movement_cooldown = 1
|
||||
|
||||
icon_state = "eclipse_plant"
|
||||
icon_living = "eclipse_plant"
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/thorn
|
||||
special_attack_cooldown = 30 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/plant/do_special_attack(atom/A)
|
||||
var/mob/living/carbon/human/H = A
|
||||
var/obj/item/I = H.get_active_hand()
|
||||
H.drop_item()
|
||||
if(I)
|
||||
I.throw_at(src, 2, 4) // Just yoinked.
|
||||
src.visible_message(span_danger("The [name] heaves, pulling \the [A]'s weapon from their hands!"))
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/experimenter
|
||||
name = "Lunar Eclipse Experimenter"
|
||||
desc = "A lizard cladded in strange red-purple armor, seemingly guarded from lasers and energy based weaponry."
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
icon_state = "eclipse_gravliz"
|
||||
icon_living = "eclipse_gravliz"
|
||||
reload_max = 1
|
||||
movement_cooldown = 1
|
||||
|
||||
special_attack_cooldown = 30 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
|
||||
projectiletype = /obj/item/projectile/energy/spikeenergy_ball //using the weapon found upon tyr
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/experimenter/do_special_attack(atom/A)
|
||||
var/D = src
|
||||
var/mob/living/carbon/human/H = A
|
||||
H.throw_at(D, 2, 4) // Just yoinked.
|
||||
visible_message(span_danger("The [src]'s armor glows silver, pulling [A] closer!"))
|
||||
|
||||
//The Precursor intative big folks
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/titanhunter //lunar melee unit
|
||||
name = "Lunar Eclipse Titan Hunter"
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
desc = "A strange being with resistance to brunt force trauma."
|
||||
icon_state = "eclipse_titan"
|
||||
icon_living = "eclipse_titan"
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 20
|
||||
attack_armor_pen = 20
|
||||
projectiletype = null
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/titanhunter/apply_melee_effects(atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
L.add_modifier(/datum/modifier/deep_wounds, 10 SECONDS)
|
||||
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!"))
|
||||
playsound(src, "punch", 50, 1)
|
||||
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/nuclear
|
||||
name = "Solar Eclipse Nuclear Technician"
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
desc = "A strange being wearing a burn resistaint coat."
|
||||
icon_state = "eclipse_nuke"
|
||||
projectiletype = /obj/item/projectile/energy/declone
|
||||
special_attack_cooldown = 15 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 9
|
||||
|
||||
|
||||
/obj/item/projectile/arc/radioactive/weak
|
||||
rad_power = 25
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/nuclear/do_special_attack(atom/A)
|
||||
visible_message(span_warning("\The [src] begins to glow green!"))
|
||||
Beam(A, icon_state = "sat_beam", time = 3 SECONDS, maxdistance = INFINITY)
|
||||
sleep(30)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/beam/energy_net(get_turf(src))
|
||||
P.launch_projectile(A, BP_TORSO, src)
|
||||
|
||||
//Vistors of the other
|
||||
//One is a familiar shape from Sif, the other is new and anomalous based.
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/froststalker //teleporting stalker
|
||||
name = "Solar Eclipse Froststalker"
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
desc = "A somewhat see through being wearing a burn resistaint coat."
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 10
|
||||
attack_armor_pen = 40
|
||||
special_attack_cooldown = 25 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
projectiletype = null
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
icon_state = "froststalker"
|
||||
icon_living = "froststalker"
|
||||
cold_resist = 1.0
|
||||
melee_attack_delay = 1.5
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/froststalker/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(4, 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/smoke_spread/frost
|
||||
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_warning("\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()
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/abyssdiver
|
||||
name = "Lunar Eclipse Abyss Diver"
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
desc = "A strange being wearing a blunt resistaint coat."
|
||||
projectiletype = /obj/item/projectile/scatter/shotgun
|
||||
icon_state = "eclipse_diver" //note to self try to redo this sprite sometime
|
||||
reload_count = 1
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/abyssdiver/do_special_attack(atom/A)
|
||||
var/mob/living/L = A
|
||||
visible_message(span_danger("\The [src] begins to mess with a wrist mounted device."))
|
||||
sleep(30)
|
||||
if(isliving(A))
|
||||
if(iscarbon(L))
|
||||
return
|
||||
else if(issilicon(L))
|
||||
if(isrobot(L))
|
||||
L.Weaken(10)
|
||||
else if(istype(A, /obj/mecha))
|
||||
var/obj/mecha/M = A
|
||||
visible_message(span_critical("\The [M] is remotly hacked and ejects [M.occupant]!"))
|
||||
M.go_out()
|
||||
|
||||
@@ -194,7 +194,7 @@
|
||||
|
||||
|
||||
/mob/living/simple_mob/mechanical/hivebot/swarm/eclipse
|
||||
faction = "eclipse"
|
||||
faction = FACTION_ECLIPSE
|
||||
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/captain
|
||||
@@ -366,3 +366,194 @@
|
||||
var/turf/T = pick(bomb_range)
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
bomb_range -= T
|
||||
|
||||
/mob/living/simple_mob/mechanical/combat_drone/artillery
|
||||
faction = FACTION_ECLIPSE
|
||||
projectiletype = /obj/item/projectile/arc/blue_energy
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead
|
||||
name = "Eclipse Precursor Overseer"
|
||||
icon_state = "overseer"
|
||||
health = 300
|
||||
maxHealth = 300
|
||||
grab_resist = 100
|
||||
var/fullshield = 6
|
||||
var/shieldrage = 6
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/bullet_act(obj/item/projectile/P) //Projectiles will be absorbed by the shield. Note to self do funky sprite. 10 hits to remove
|
||||
if(fullshield > 0)
|
||||
fullshield--
|
||||
if(fullshield > 0)
|
||||
visible_message(span_warning(span_orange("<B>[P] is absorbed by the shield!.</B>")))
|
||||
else
|
||||
visible_message(span_warning(span_orange("<B>[P] breaks the shield!!.</B>")))
|
||||
else
|
||||
..()
|
||||
shieldrage--
|
||||
if(shieldrage == 0)
|
||||
shieldrage = 6
|
||||
fullshield = 6
|
||||
visible_message(span_warning(span_orange("<B>The shield reactivates!!.</B>")))
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/do_special_attack(atom/A)
|
||||
if(vore_fullness > 2) //If they nompf someone already
|
||||
fullsummon(A)
|
||||
var/mob/living/L = A
|
||||
|
||||
if(istype(A, /obj/mecha))//if target is a mecha
|
||||
switch(a_intent)
|
||||
if(I_DISARM) // Phase 3
|
||||
mech_three(A)
|
||||
if(I_HURT) // Phase 1
|
||||
mech_one(A)
|
||||
if(I_GRAB) // Phase 2
|
||||
mech_two(A)
|
||||
|
||||
if(!L.devourable || !L.allowmobvore || !L.can_be_drop_prey || !L.throw_vore) //if they aren't edible
|
||||
if(fullshield > 0)
|
||||
switch(a_intent)
|
||||
if(I_DISARM) // Phase 3
|
||||
shield_three(A)
|
||||
if(I_HURT) // Phase 1
|
||||
shield_one(A)
|
||||
if(I_GRAB) // Phase 2
|
||||
shield_two(A)
|
||||
else
|
||||
switch(a_intent)
|
||||
if(I_DISARM) // Phase 3
|
||||
phase_three(A)
|
||||
if(I_HURT) // Phase 1
|
||||
phase_one(A)
|
||||
if(I_GRAB) // Phase 2
|
||||
phase_two(A)
|
||||
else
|
||||
var/obj/belly/belly_dest
|
||||
L.forceMove(belly_dest)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/fullsummon(atom/target) //Summons a wall whilst the boss tries to enjoy their meal
|
||||
visible_message(span_warning("\The [src] calls in drone support!"))
|
||||
new /mob/living/simple_mob/mechanical/combat_drone/artillery (src.loc)
|
||||
sleep(30)
|
||||
new /mob/living/simple_mob/mechanical/combat_drone/artillery (src.loc)
|
||||
sleep(30)
|
||||
new /mob/living/simple_mob/mechanical/combat_drone/artillery (src.loc)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/mech_two(atom/target) //Forces the mecha user in a strange dance, being forced out, likly dodging one projectile and getting back in
|
||||
var/obj/mecha/M = target
|
||||
visible_message(span_critical("\The [M] is remotly hacked and ejects [M.occupant]!"))
|
||||
M.go_out()
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/mech_one(atom/target) //might alter this one to a machine gun esque ion fire
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/ion(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
sleep(5)
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
sleep(5)
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
sleep(5)
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
sleep(5)
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/mech_three(atom/target) //did we ever fix fire bypassing mechas?
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/scatter/flamethrower(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/phase_one(atom/target) //Simply tries to disable you
|
||||
visible_message(span_alien("\The [src] pulls out a flash!"))
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
if(C.stat != DEAD)
|
||||
var/safety = C.eyecheck()
|
||||
if(safety <= 0)
|
||||
var/flash_strength = 8
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
flash_strength *= H.species.flash_mod
|
||||
if(flash_strength > 0)
|
||||
to_chat(H, span_alien("You are disoriented by \the [src]!"))
|
||||
H.eye_blurry = max(H.eye_blurry, flash_strength + 5)
|
||||
H.flash_eyes()
|
||||
H.apply_damage(flash_strength * H.species.flash_burn/5, BURN, BP_HEAD, 0, 0, "Photon burns")
|
||||
|
||||
else if(issilicon(L))
|
||||
if(isrobot(L))
|
||||
var/flashfail = FALSE
|
||||
var/mob/living/silicon/robot/R = L
|
||||
if(!flashfail)
|
||||
to_chat(R, span_alien("Your optics are scrambled by \the [src]!"))
|
||||
R.Confuse(10)
|
||||
R.flash_eyes()
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/phase_two(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/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()
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/phase_three(atom/target) //This might friendly fire itself, but funny and final phase
|
||||
Beam(target, icon_state = "sat_beam", time = 2.5 SECONDS, maxdistance = INFINITY)
|
||||
sleep(30)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/beam/chain_lightning(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/shield_one(atom/target)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/temp/hot(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/shield_two(atom/target)
|
||||
if(prob(50))
|
||||
visible_message(span_alien("\The [src] begins to bandage their wounds."))
|
||||
sleep(30)
|
||||
adjustBruteLoss(-25.0)
|
||||
visible_message(span_alien("\The [src] begins to salve their burns."))
|
||||
sleep(30)
|
||||
adjustFireLoss(-25.0)
|
||||
else
|
||||
visible_message(span_alien("\The [src] consumes an odd pill."))
|
||||
add_modifier(/datum/modifier/aura/slime_heal, 15, src)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/shield_three(atom/target)
|
||||
Beam(target, icon_state = "sat_beam", time = 2.5 SECONDS, maxdistance = INFINITY)
|
||||
sleep(30)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/beam/lightning(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -289,7 +289,7 @@
|
||||
movement_cooldown = -1
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
special_attack_cooldown = 0.5 SECONDS
|
||||
special_attack_cooldown = 3.5 SECONDS
|
||||
projectiletype = /obj/item/projectile/energy/mob/precursor
|
||||
weatherprojectile = /obj/item/projectile/energy/mob/precursor
|
||||
var/attack_cycle = 1
|
||||
|
||||
399
modular_chomp/code/modules/planet/tyr.dm
Normal file
399
modular_chomp/code/modules/planet/tyr.dm
Normal file
@@ -0,0 +1,399 @@
|
||||
var/datum/planet/tyr/planet_tyr = null
|
||||
|
||||
/datum/time/tyr
|
||||
seconds_in_day = 24 HOURS
|
||||
|
||||
/datum/planet/tyr
|
||||
name = "Tyr"
|
||||
desc = "Tyr, a hot planet." //rewrite me
|
||||
current_time = new /datum/time/tyr()
|
||||
// expected_z_levels = list(1) // This is defined elsewhere.
|
||||
planetary_wall_type = /turf/unsimulated/wall/planetary/normal/thor
|
||||
|
||||
/datum/planet/tyr/New()
|
||||
..()
|
||||
planet_thor = src
|
||||
weather_holder = new /datum/weather_holder/tyr(src)
|
||||
|
||||
/datum/planet/tyr/update_sun()
|
||||
..()
|
||||
var/datum/time/time = current_time
|
||||
var/length_of_day = time.seconds_in_day / 10 / 60 / 60
|
||||
var/noon = length_of_day / 2
|
||||
var/distance_from_noon = abs(text2num(time.show_time("hh")) - noon)
|
||||
sun_position = distance_from_noon / noon
|
||||
sun_position = abs(sun_position - 1)
|
||||
|
||||
var/low_brightness = null
|
||||
var/high_brightness = null
|
||||
|
||||
var/low_color = null
|
||||
var/high_color = null
|
||||
var/min = 0
|
||||
|
||||
switch(sun_position)
|
||||
if(0 to 0.20) // Night
|
||||
low_brightness = 0.1
|
||||
low_color = "#0A0028"
|
||||
|
||||
high_brightness = 0.3
|
||||
high_color = "#21007F"
|
||||
min = 0
|
||||
|
||||
if(0.20 to 0.30) // Twilight
|
||||
low_brightness = 0.35
|
||||
low_color = "#310D54"
|
||||
|
||||
high_brightness = 0.5
|
||||
high_color = "#58389E"
|
||||
min = 0.40
|
||||
|
||||
if(0.30 to 0.40) // Sunrise/set
|
||||
low_brightness = 0.5
|
||||
low_color = "#19277F"
|
||||
|
||||
high_brightness = 0.6
|
||||
high_color = "#2437B5"
|
||||
min = 0.50
|
||||
|
||||
if(0.40 to 1.00) // Noon
|
||||
low_brightness = 0.6
|
||||
low_color = "#487EBF"
|
||||
|
||||
high_brightness = 0.7
|
||||
high_color = "#2B95FF"
|
||||
min = 0.70
|
||||
|
||||
var/interpolate_weight = (abs(min - sun_position)) * 4
|
||||
var/weather_light_modifier = 1
|
||||
if(weather_holder && weather_holder.current_weather)
|
||||
weather_light_modifier = weather_holder.current_weather.light_modifier
|
||||
|
||||
var/new_brightness = (LERP(low_brightness, high_brightness, interpolate_weight) ) * weather_light_modifier
|
||||
|
||||
var/new_color = null
|
||||
if(weather_holder && weather_holder.current_weather && weather_holder.current_weather.light_color)
|
||||
new_color = weather_holder.current_weather.light_color
|
||||
else
|
||||
var/list/low_color_list = hex2rgb(low_color)
|
||||
var/low_r = low_color_list[1]
|
||||
var/low_g = low_color_list[2]
|
||||
var/low_b = low_color_list[3]
|
||||
|
||||
var/list/high_color_list = hex2rgb(high_color)
|
||||
var/high_r = high_color_list[1]
|
||||
var/high_g = high_color_list[2]
|
||||
var/high_b = high_color_list[3]
|
||||
|
||||
var/new_r = LERP(low_r, high_r, interpolate_weight)
|
||||
var/new_g = LERP(low_g, high_g, interpolate_weight)
|
||||
var/new_b = LERP(low_b, high_b, interpolate_weight)
|
||||
|
||||
new_color = rgb(new_r, new_g, new_b)
|
||||
|
||||
spawn(1)
|
||||
update_sun_deferred(new_brightness, new_color)
|
||||
|
||||
//Ooooh weathers
|
||||
/datum/weather_holder/tyr
|
||||
temperature = 313
|
||||
allowed_weather_types = list(
|
||||
WEATHER_CLEAR = new /datum/weather/tyr/clear(),
|
||||
WEATHER_FIRESTART = new /datum/weather/tyr/firestart(),
|
||||
WEATHER_FLAMESTORM = new /datum/weather/tyr/flamestorm(),
|
||||
WEATHER_SANDSTORM = new /datum/weather/tyr/sandstorm(),
|
||||
WEATHER_HEAVYSANDSTORM = new /datum/weather/tyr/sandstorm_fierce(),
|
||||
WEATHER_FALLOUT_TEMP = new /datum/weather/tyr/starrynight(),
|
||||
WEATHER_BLIZZARD = new /datum/weather/tyr/blizzard(),
|
||||
WEATHER_STORM = new /datum/weather/tyr/storm(),
|
||||
WEATHER_FOG = new /datum/weather/tyr/fog()
|
||||
|
||||
)
|
||||
roundstart_weather_chances = list(
|
||||
WEATHER_CLEAR = 100
|
||||
)
|
||||
|
||||
/datum/weather/tyr
|
||||
name = "tyr"
|
||||
temp_high = 323.15
|
||||
temp_low = 300.15
|
||||
|
||||
/datum/weather/tyr/clear
|
||||
name = "clear"
|
||||
transition_chances = list(
|
||||
WEATHER_FIRESTART = 20,
|
||||
WEATHER_CLEAR = 45,
|
||||
WEATHER_SANDSTORM = 30
|
||||
)
|
||||
transition_messages = list(
|
||||
"The sky clears up.",
|
||||
"The sky is visible.",
|
||||
"The weather is calm."
|
||||
)
|
||||
sky_visible = TRUE
|
||||
observed_message = "The sky is clear."
|
||||
imminent_transition_message = "The sky is rapidly clearing up."
|
||||
|
||||
/datum/weather/tyr/firestart
|
||||
name = "warm winds"
|
||||
icon_state = "ashfall_light"
|
||||
transition_chances = list(
|
||||
WEATHER_FIRESTART = 50,
|
||||
WEATHER_FLAMESTORM = 50)
|
||||
transition_messages = list(
|
||||
"The sky begins to turn orange."
|
||||
)
|
||||
sky_visible = TRUE
|
||||
observed_message = "The sky is orange."
|
||||
imminent_transition_message = "The sky flares orange."
|
||||
|
||||
|
||||
/datum/weather/tyr/flamestorm
|
||||
name = "fire storm"
|
||||
icon_state = "ashfall_light"
|
||||
transition_chances = list(
|
||||
WEATHER_FLAMESTORM = 50,
|
||||
WEATHER_CLEAR = 50)
|
||||
transition_messages = list(
|
||||
"The sky is engulfed by flames."
|
||||
)
|
||||
sky_visible = TRUE
|
||||
observed_message = "The sky is on fire."
|
||||
imminent_transition_message = "The sky is set ablaze."
|
||||
|
||||
/datum/weather/tyr/flamestorm/process_effects()
|
||||
..()
|
||||
for(var/mob/living/carbon/H as anything in human_mob_list)
|
||||
if(H?.z in holder.our_planet.expected_z_levels) // CHOMPedit Add a check that L has to be valid and not null
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T.is_outdoors())
|
||||
continue
|
||||
|
||||
var/target_zone = pick(BP_ALL)
|
||||
var/amount_blocked = H.run_armor_check(target_zone, "bio")
|
||||
var/amount_soaked = H.get_armor_soak(target_zone, "bio")
|
||||
|
||||
var/damage = rand(1,1)
|
||||
|
||||
if(amount_blocked >= 40)
|
||||
continue
|
||||
|
||||
if(amount_soaked >= damage)
|
||||
continue // No need to apply damage.
|
||||
|
||||
H.apply_damage(damage, BURN, target_zone, amount_blocked, amount_soaked, used_weapon = "burning ash")
|
||||
if(show_message)
|
||||
to_chat(H, effect_message)
|
||||
|
||||
/datum/weather/tyr/sandstorm
|
||||
name = "sandstorm"
|
||||
icon_state = "sandstorm"
|
||||
transition_chances = list(
|
||||
WEATHER_FIRESTART = 15,
|
||||
WEATHER_CLEAR = 55,
|
||||
WEATHER_SANDSTORM = 15,
|
||||
WEATHER_HEAVYSANDSTORM = 15)
|
||||
transition_messages = list(
|
||||
"The sky is engulfed by sand."
|
||||
)
|
||||
sky_visible = TRUE
|
||||
observed_message = "The sky is full of sand."
|
||||
imminent_transition_message = "Pebbles begin to fill the sky."
|
||||
|
||||
|
||||
/datum/weather/tyr/sandstorm/process_effects()
|
||||
..()
|
||||
for(var/mob/living/carbon/H as anything in human_mob_list)
|
||||
if(H?.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T.is_outdoors())
|
||||
continue
|
||||
|
||||
var/target_zone = pick(BP_ALL)
|
||||
var/amount_blocked = H.run_armor_check(target_zone, "melee")
|
||||
var/amount_soaked = H.get_armor_soak(target_zone, "melee")
|
||||
|
||||
var/damage = rand(1,2)
|
||||
|
||||
if(amount_blocked >= 10)
|
||||
continue
|
||||
|
||||
if(amount_soaked >= damage)
|
||||
continue // No need to apply damage.
|
||||
|
||||
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "sand")
|
||||
if(show_message)
|
||||
to_chat(H, effect_message)
|
||||
|
||||
/datum/weather/tyr/sandstorm_fierce
|
||||
name = "fierce sandstorm"
|
||||
icon_state = "sandstorm"
|
||||
transition_chances = list(
|
||||
WEATHER_FIRESTART = 15,
|
||||
WEATHER_CLEAR = 55,
|
||||
WEATHER_SANDSTORM = 15,
|
||||
WEATHER_HEAVYSANDSTORM = 15)
|
||||
transition_messages = list(
|
||||
"The sky is engulfed by sand."
|
||||
)
|
||||
sky_visible = TRUE
|
||||
observed_message = "The sky is full of sand."
|
||||
light_color = "#996600"
|
||||
light_modifier = 0.5
|
||||
|
||||
imminent_transition_message = "The sky is blocked out by rock."
|
||||
|
||||
/datum/weather/tyr/sandstorm_fierce/process_effects()
|
||||
..()
|
||||
for(var/mob/living/carbon/H as anything in human_mob_list)
|
||||
if(H?.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T.is_outdoors())
|
||||
continue
|
||||
|
||||
var/target_zone = pick(BP_ALL)
|
||||
var/amount_blocked = H.run_armor_check(target_zone, "melee")
|
||||
var/amount_soaked = H.get_armor_soak(target_zone, "melee")
|
||||
|
||||
var/damage = rand(7,7)
|
||||
|
||||
if(amount_blocked >= 40)
|
||||
continue
|
||||
|
||||
if(amount_soaked >= damage)
|
||||
continue // No need to apply damage.
|
||||
|
||||
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "sand")
|
||||
if(show_message)
|
||||
to_chat(H, effect_message)
|
||||
|
||||
//Anomalous/summonable weather
|
||||
/datum/weather/tyr/starrynight
|
||||
name = "unknown"
|
||||
icon_state = "starry_night"
|
||||
transition_chances = list(
|
||||
WEATHER_CLEAR = 50,
|
||||
WEATHER_FALLOUT_TEMP = 50)
|
||||
|
||||
imminent_transition_message = "The sky is rapidly begins to glow."
|
||||
|
||||
/datum/weather/tyr/starrynight/process_effects()
|
||||
..()
|
||||
for(var/mob/living/carbon/H as anything in human_mob_list)
|
||||
if(H?.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T.is_outdoors())
|
||||
continue
|
||||
H.add_modifier(/datum/modifier/starrynight_boon, 1 SECONDS, src)
|
||||
|
||||
/datum/weather/tyr/blizzard
|
||||
name = "blizzard"
|
||||
icon_state = "snowfall_heavy_old"
|
||||
temp_high = 123.15
|
||||
temp_low = 100.15
|
||||
transition_chances = list(
|
||||
WEATHER_CLEAR = 50,
|
||||
WEATHER_BLIZZARD = 50)
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/storm
|
||||
indoor_sounds_type = /datum/looping_sound/weather/storm/indoors
|
||||
|
||||
imminent_transition_message = "The sky is overtaken by snow."
|
||||
|
||||
/datum/weather/tyr/storm
|
||||
icon_state = "fallout"
|
||||
light_modifier = 0.7
|
||||
light_color = "#CCFFCC"
|
||||
transition_chances = list(
|
||||
WEATHER_CLEAR = 50,
|
||||
WEATHER_STORM = 50)
|
||||
imminent_transition_message = "Sky and clouds are growing sickly green... Radiation storm is approaching, get to cover!"
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/wind
|
||||
indoor_sounds_type = /datum/looping_sound/weather/wind/indoors
|
||||
|
||||
imminent_transition_message = "The sky is overtaken by green clouds."
|
||||
|
||||
// How much radiation a mob gets while on an outside tile.
|
||||
var/direct_rad_low = RAD_LEVEL_LOW
|
||||
var/direct_rad_high = RAD_LEVEL_MODERATE
|
||||
|
||||
// How much radiation is bursted onto a random tile near a mob.
|
||||
var/fallout_rad_low = RAD_LEVEL_HIGH
|
||||
var/fallout_rad_high = RAD_LEVEL_VERY_HIGH
|
||||
|
||||
/datum/weather/tyr/storm/process_effects()
|
||||
..()
|
||||
for(var/mob/living/L as anything in living_mob_list)
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
irradiate_nearby_turf(L)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.is_outdoors())
|
||||
continue // They're indoors, so no need to irradiate them with fallout.
|
||||
|
||||
L.rad_act(rand(direct_rad_low, direct_rad_high))
|
||||
|
||||
// This makes random tiles near people radioactive for awhile.
|
||||
// Tiles far away from people are left alone, for performance.
|
||||
/datum/weather/tyr/storm/proc/irradiate_nearby_turf(mob/living/L)
|
||||
if(!istype(L))
|
||||
return
|
||||
var/list/turfs = RANGE_TURFS(world.view, L)
|
||||
var/turf/T = pick(turfs) // We get one try per tick.
|
||||
if(!istype(T))
|
||||
return
|
||||
if(T.is_outdoors())
|
||||
SSradiation.radiate(T, rand(fallout_rad_low, fallout_rad_high))
|
||||
|
||||
|
||||
|
||||
/datum/weather/tyr/fog
|
||||
light_modifier = 0.5
|
||||
light_color = "#FF0000"
|
||||
transition_chances = list(
|
||||
WEATHER_CLEAR = 50,
|
||||
WEATHER_FOG = 50)
|
||||
|
||||
imminent_transition_message = "Fog emerges from nowhere."
|
||||
|
||||
var/next_lightning_strike = 0 // world.time when lightning will strike.
|
||||
var/min_lightning_cooldown = 5 SECONDS
|
||||
var/max_lightning_cooldown = 1 MINUTE
|
||||
|
||||
/datum/weather/tyr/fog/process_effects()
|
||||
..()
|
||||
for(var/mob/living/L as anything in living_mob_list)
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.is_outdoors())
|
||||
continue // They're indoors, so no need to rain on them.
|
||||
|
||||
// If they have an open umbrella, it'll guard from rain
|
||||
var/obj/item/melee/umbrella/U = L.get_active_hand()
|
||||
if(!istype(U) || !U.open)
|
||||
U = L.get_inactive_hand()
|
||||
|
||||
if(istype(U) && U.open)
|
||||
if(show_message)
|
||||
to_chat(L, span_notice("Rain showers loudly onto your umbrella!"))
|
||||
continue
|
||||
|
||||
|
||||
L.water_act(2)
|
||||
if(show_message)
|
||||
to_chat(L, effect_message)
|
||||
|
||||
handle_lightning()
|
||||
|
||||
// This gets called to do lightning periodically.
|
||||
// There is a seperate function to do the actual lightning strike, so that badmins can play with it.
|
||||
/datum/weather/tyr/fog/proc/handle_lightning()
|
||||
if(world.time < next_lightning_strike)
|
||||
return // It's too soon to strike again.
|
||||
next_lightning_strike = world.time + rand(min_lightning_cooldown, max_lightning_cooldown)
|
||||
var/turf/T = pick(holder.our_planet.planet_floors) // This has the chance to 'strike' the sky, but that might be a good thing, to scare reckless pilots.
|
||||
lightning_strike(T)
|
||||
|
||||
/*
|
||||
WEATHER_BLIZZARD = new (),
|
||||
WEATHER_STORM = new(),
|
||||
WEATHER_FOG = new /datum/weather/tyr/fog()
|
||||
*/
|
||||
150
modular_chomp/code/modules/projectiles/precursor/tyr.dm
Normal file
150
modular_chomp/code/modules/projectiles/precursor/tyr.dm
Normal file
@@ -0,0 +1,150 @@
|
||||
//Okay, so we have currently have four prototype
|
||||
//A crystal, enginge, core and a hilt.
|
||||
//So four weapons although the alien junk is interchangeable cause fun
|
||||
//All tyr weapons are battery locked, and cannot have their cell changed but self recharge.
|
||||
//Also short range
|
||||
//So hilt, ball and chain wierd weapon. Has actual melee damage. Projectile is slow, recharge is slow, night no ammo, range of seven
|
||||
//Basic medium size blaster. Range of 5. Core base
|
||||
//Shotgun type weapon. Range of 3. Small knockback of foes, high damage. Engine
|
||||
//Now the crystal weapon...laser Range of 4.
|
||||
//Damages be funky to figure out good numbers for
|
||||
|
||||
//The energy ball and shot gun get 35 damage for being similair bits of high risk and high reward. the BnC will take a whilst to recharge/
|
||||
//So if you miss, you're stuck with a middling melee weapon for a bit.
|
||||
//Whilst the shot gun has more shots, but you need to get up closih.
|
||||
//Chain gets AP whilst shotgun gets knockback
|
||||
/obj/item/projectile/energy/spikeenergy_ball
|
||||
name = "energy ball"
|
||||
icon = 'modular_chomp/icons/obj/guns/precursor/tyr.dmi'
|
||||
icon_state = "spikeenergyball"
|
||||
damage = 60 //after remebering throwing things into walls deals bonus damage. Will that wall thwacking out damage this 5 bonus...yes. But shotgun likly wins most DPS tests anyway
|
||||
armor_penetration = 60 //damage and AP matching makes brain happy for some reason. No real logic here, just brain saying yes, this is right
|
||||
range = 7
|
||||
speed = 5
|
||||
check_armour = "melee"
|
||||
damage_type = BRUTE
|
||||
|
||||
/obj/item/projectile/energy/wp_shotgun
|
||||
name = "laser blast"
|
||||
icon = 'modular_chomp/icons/obj/guns/precursor/tyr.dmi'
|
||||
icon_state = "shotgun_blast"
|
||||
damage = 45
|
||||
range = 3
|
||||
check_armour = "laser"
|
||||
|
||||
/obj/item/projectile/energy/wp_shotgun/on_hit(var/atom/movable/target, var/blocked = 0)
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
var/throwdir = get_dir(firer,L)
|
||||
L.throw_at(get_edge_target_turf(L, throwdir), 3, 10)
|
||||
return 1
|
||||
|
||||
//The blaster has 1 more range but lacks hitscan whilst the laser has 1 less range but has hitscan.
|
||||
/obj/item/projectile/energy/wp_blaster
|
||||
name = "laser blast"
|
||||
icon = 'modular_chomp/icons/obj/guns/precursor/tyr.dmi'
|
||||
icon_state = "blaster_blast"
|
||||
damage = 30
|
||||
range = 5
|
||||
check_armour = "laser"
|
||||
|
||||
/obj/item/projectile/beam/precursor_tyr
|
||||
name = "laser"
|
||||
icon_state = "laser"
|
||||
damage = 30
|
||||
damage_type = BURN
|
||||
check_armour = "laser"
|
||||
range = 4
|
||||
eyeblur = 0 //no no no no no
|
||||
hitscan = 1
|
||||
hud_state = "laser"
|
||||
hud_state_empty = "battery_empty"
|
||||
|
||||
/obj/item/gun/energy/energyballchain
|
||||
name = "remade prototype weapon"
|
||||
desc = "A weapon created from strange alien junk and blueprints"
|
||||
icon = 'modular_chomp/icons/obj/guns/precursor/tyr.dmi'
|
||||
icon_state = "violence"
|
||||
item_state = "violence"
|
||||
wielded_item_state = "placeholder"
|
||||
origin_tech = list(TECH_COMBAT = 6, TECH_POWER = 5, TECH_PRECURSOR = 3)
|
||||
|
||||
charge_cost = 5000 //Uses all it's charge in a single shot.
|
||||
battery_lock = 1 //No changing
|
||||
|
||||
accept_cell_type = /obj/item/cell/device
|
||||
cell_type = /obj/item/cell/device/weapon/recharge/alien
|
||||
projectile_type = /obj/item/projectile/energy/spikeenergy_ball
|
||||
|
||||
force = 30 //functions as a melee weapon too! Ain't great, but still works.
|
||||
|
||||
recoil_mode = 0
|
||||
charge_meter = 1
|
||||
|
||||
move_delay = 0
|
||||
one_handed_penalty = 50
|
||||
|
||||
/obj/item/gun/energy/curse_tyrshotgun
|
||||
name = "remade prototype weapon"
|
||||
desc = "A weapon created from strange alien junk and blueprints"
|
||||
icon = 'modular_chomp/icons/obj/guns/precursor/tyr.dmi'
|
||||
icon_state = "shotgun"
|
||||
item_state = "shotgun"
|
||||
wielded_item_state = "placeholder"
|
||||
origin_tech = list(TECH_COMBAT = 6, TECH_POWER = 5, TECH_PRECURSOR = 3)
|
||||
|
||||
charge_cost = 1000 //Five shots
|
||||
battery_lock = 1 //No changing
|
||||
|
||||
accept_cell_type = /obj/item/cell/device
|
||||
cell_type = /obj/item/cell/device/weapon/recharge/alien
|
||||
projectile_type = /obj/item/projectile/energy/wp_shotgun
|
||||
|
||||
recoil_mode = 0
|
||||
charge_meter = 1
|
||||
|
||||
move_delay = 0
|
||||
one_handed_penalty = 50
|
||||
|
||||
/obj/item/gun/energy/curse_blaster
|
||||
name = "remade prototype weapon"
|
||||
desc = "A weapon created from strange alien junk and blueprints"
|
||||
icon = 'modular_chomp/icons/obj/guns/precursor/tyr.dmi'
|
||||
icon_state = "solider_blaster"
|
||||
item_state = "solider_blaster"
|
||||
wielded_item_state = "placeholder"
|
||||
origin_tech = list(TECH_COMBAT = 6, TECH_POWER = 5, TECH_PRECURSOR = 3)
|
||||
|
||||
charge_cost = 250
|
||||
battery_lock = 1 //No changing
|
||||
|
||||
accept_cell_type = /obj/item/cell/device
|
||||
cell_type = /obj/item/cell/device/weapon/recharge/alien
|
||||
projectile_type = /obj/item/projectile/energy/wp_blaster
|
||||
|
||||
recoil_mode = 0
|
||||
charge_meter = 1
|
||||
|
||||
move_delay = 0
|
||||
one_handed_penalty = 50
|
||||
|
||||
/obj/item/gun/energy/curse_lasershooter
|
||||
name = "remade prototype weapon"
|
||||
desc = "A weapon created from strange alien junk and blueprints"
|
||||
icon = 'modular_chomp/icons/obj/guns/precursor/tyr.dmi'
|
||||
icon_state = "crystal_blaster"
|
||||
item_state = "crystal_blaster"
|
||||
origin_tech = list(TECH_COMBAT = 6, TECH_POWER = 5, TECH_PRECURSOR = 3)
|
||||
|
||||
charge_cost = 250 //twenty shots
|
||||
battery_lock = 1 //No changing
|
||||
|
||||
accept_cell_type = /obj/item/cell/device
|
||||
cell_type = /obj/item/cell/device/weapon/recharge/alien
|
||||
projectile_type = /obj/item/projectile/beam/precursor_tyr
|
||||
|
||||
recoil_mode = 0
|
||||
charge_meter = 1
|
||||
|
||||
move_delay = 0
|
||||
one_handed_penalty = 50
|
||||
Reference in New Issue
Block a user