diff --git a/modular_chomp/code/game/objects/structures/tyr_project_props.dm b/modular_chomp/code/game/objects/structures/tyr_project_props.dm index 3091543a32..9f2cdf6ba2 100644 --- a/modular_chomp/code/game/objects/structures/tyr_project_props.dm +++ b/modular_chomp/code/game/objects/structures/tyr_project_props.dm @@ -626,3 +626,10 @@ info = "We need serious back up if we are to stay here long term. Random folks keep stumbling upon the sivian side and blasting, unsure if they are bounty hunters, or maniacs but no SOL attention yet.
\ The other day we had reports of masked and hooded men hovering over lava, although that may be disregarded. We found mold and mushrooms in some of our rations, and there was no physical sign of them.
\ Although Rift Watchers may be stalking this location. The ants are also adapting to us and our gear. We need something, a simple mecha will do." + +/obj/item/paper/tyr_notes/astral_e + name = "The Astral Houses" + info = "Our orginization is split into three houses like we once had, but our foundation is firmer then before. One house for the mind, one for the soul and one for the body.
\ + The house of the mind shall focus upon our research, furthering our way torwards the bright future.
\ + The house of the soul shall focus upon us, keeping out spirits high and focus narrow.
\ + Lastly, the house of the body shall provide the most fierce of protection." diff --git a/modular_chomp/code/modules/exploration/tyr_tribal_gear.dm b/modular_chomp/code/modules/exploration/tyr_tribal_gear.dm index 2d2d0b00d4..6ea2763883 100644 --- a/modular_chomp/code/modules/exploration/tyr_tribal_gear.dm +++ b/modular_chomp/code/modules/exploration/tyr_tribal_gear.dm @@ -341,3 +341,63 @@ var/atom/target_zone = get_edge_target_turf(user,get_dir(user, target)) if(!target.anchored) target.throw_at(target_zone, 5, 2, user, FALSE) + +/obj/item/melee/energy/tyr_chainsaw + name = "tyrian butcher blade" + slot_flags = SLOT_BELT | SLOT_BACK + desc = "What appears to be a weaponized chainsaw." + description_info = "Utilizes charge, recharges with time" + lcolor = null + colorable = FALSE + + active_force = 60 + active_armourpen = 20 + + attackspeed = 15 + defend_chance = 0 + projectile_parry_chance = 0 + + active_w_class = ITEMSIZE_HUGE + can_cleave = TRUE + + hitcost = 320 + use_cell = TRUE + + icon = 'modular_chomp/icons/mob/tribal_gear.dmi' + icon_state = "chainsaw" + item_state = "chainsaw" + + item_icons = list( + slot_l_hand_str = 'modular_chomp/icons/obj/guns/precursor/lefthand.dmi', + slot_r_hand_str = 'modular_chomp/icons/obj/guns/precursor/righthand.dmi', + ) + +/obj/item/melee/energy/tyr_chainsaw/Initialize(mapload) + . = ..() + bcell = new/obj/item/cell/device/weapon/recharge/alien/tyr(src) + +/obj/item/shield/tyr_shield + name = "tyrian portable energy barrier" + desc = "A shield with a strange property of reducing the damage of projectiles instead of being effective at blocking them." + icon = 'modular_chomp/icons/mob/tribal_gear.dmi' + icon_state = "barrier" + item_state = "barrier" + + slot_flags = SLOT_BACK + + w_class = ITEMSIZE_LARGE + attack_verb = list("shoved", "bashed") + base_block_chance = 15 + +/obj/item/shield/tyr_shield/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + if(user.incapacitated()) + return 0 + var/bad_arc = reverse_direction(user.dir) //arc of directions from which we cannot block + if(check_shield_arc(user, bad_arc, damage_source, attacker)) + if(prob(get_block_chance(user, damage, damage_source, attacker))) + user.visible_message(span_danger("\The [user] blocks [attack_text] with \the [src]!")) + return 1 + else + var/obj/item/projectile/P = damage_source + P.damage = P.damage / 2 + return 0 diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/animal/tyr/ants.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/animal/tyr/ants.dm index 0f7ad711b0..f2bfb6e37b 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/animal/tyr/ants.dm +++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/animal/tyr/ants.dm @@ -119,21 +119,25 @@ glow_intensity = 2 glow_toggle = TRUE var/exploded = FALSE - var/explosion_delay_lower = 2 SECOND // Lower bound for explosion delay. - var/explosion_delay_upper = 3 SECONDS // Upper bound. + var/explosion_delay_lower = 3 SECOND // Lower bound for explosion delay. + var/explosion_delay_upper = 4 SECONDS // Upper bound. /mob/living/simple_mob/animal/tyr/mineral_ants/agate/proc/explode() if(src && !exploded) visible_message(span_danger("\The [src]'s body detonates!")) exploded = TRUE - explosion(src.loc, 3, 2, 1, 1) + explosion(src.loc, 0, 3, 0, 0) -/mob/living/simple_mob/animal/tyr/mineral_ants/agate/do_special_attack(atom/A) +/mob/living/simple_mob/animal/tyr/mineral_ants/agate/death() visible_message(span_critical("\The [src]'s body begins to rupture!")) var/delay = rand(explosion_delay_lower, explosion_delay_upper) animate(src, color = "#000000", time = 0.1 SECONDS, loop = ceil(delay/2)) animate(color = "#FF0000", time = 0.1 SECONDS) addtimer(CALLBACK(src, PROC_REF(explode)), delay, TIMER_DELETE_ME) + return ..() + +/mob/living/simple_mob/animal/tyr/mineral_ants/agate/do_special_attack(atom/A) + adjustBruteLoss(30) /mob/living/simple_mob/animal/tyr/mineral_ants/quartz //irl quartz is apparently tough? name = "quartz metal ant" @@ -353,8 +357,8 @@ /obj/item/stack/material/gold = 10 ) var/exploded = FALSE - var/explosion_delay_lower = 5 SECOND // Lower bound for explosion delay. - var/explosion_delay_upper = 8 SECONDS // Upper bound. + var/explosion_delay_lower = 4 SECOND // Lower bound for explosion delay. + var/explosion_delay_upper = 5 SECONDS // Upper bound. /mob/living/simple_mob/animal/tyr/mineral_ants/gold/proc/explode() if(src && !exploded) diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/bullet_heck/puddle_mechanic.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/bullet_heck/puddle_mechanic.dm index 9b8929bd1f..f1947130e5 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/bullet_heck/puddle_mechanic.dm +++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/bullet_heck/puddle_mechanic.dm @@ -79,3 +79,10 @@ /datum/modifier/mmo_drop/metal_tomb puddleitem = /obj/structure/foamedmetal + +/obj/item/grenade/shooter/auto_explode/eclipse_dagger + spread_range = 4 + projectile_types = list(/obj/item/projectile/energy/astral_collective/dagger) + +/datum/modifier/mmo_drop/eclipse_dagger + puddleitem = /obj/item/grenade/shooter/auto_explode/eclipse_dagger diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/bullet_heck/tyrian.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/bullet_heck/tyrian.dm index 54610630fa..067f611bd6 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/bullet_heck/tyrian.dm +++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/bullet_heck/tyrian.dm @@ -291,9 +291,9 @@ melee_damage_lower = 40 melee_damage_upper = 40 attack_armor_pen = 40 - melee_attack_delay = 2.5 SECONDS + melee_attack_delay = 2.75 SECONDS movement_cooldown = 4 - special_attack_cooldown = 8 SECONDS + special_attack_cooldown = 10 SECONDS var/parry_chance = 100 /mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/crystal_boss/load_default_bellies() diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/astral_collective.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/astral_collective.dm index 2b307a2265..16a47e6cbe 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/astral_collective.dm +++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/astral_collective.dm @@ -1,7 +1,7 @@ /mob/living/simple_mob/humanoid/astral_collective name = "Astral Collective Unit" tt_desc = "E Homo sapiens" - desc = "You shouldn't be seeing this." + desc = "An armored hostile." icon = 'modular_chomp/icons/mob/eclipse.dmi' icon_state = "medi" icon_living = "medi" @@ -22,13 +22,13 @@ harm_intent_damage = 0 melee_damage_lower = 25 melee_damage_upper = 25 - melee_attack_delay = 0.75 SECONDS + melee_attack_delay = 1.25 SECONDS evasion = 20 attack_sharp = 1 attack_edge = 1 attacktext = list("slashed", "stabbed") projectile_dispersion = 0 - armor = list(melee = 30, bullet = 30, laser = 30, energy = 60, bomb = 20, bio = 100, rad = 100) // Simple mob immunuties plus minour armor + armor = list(melee = 20, bullet = 20, laser = 20, energy = 60, bomb = 20, bio = 100, rad = 100) // Simple mob immunuties plus minour armor can_be_drop_prey = FALSE can_be_drop_pred = TRUE @@ -46,6 +46,8 @@ minbodytemp = 0 heat_damage_per_tick = 0 + movement_cooldown = 3 + projectilesound = 'sound/weapons/Gunshot_light.ogg' ai_holder_type = /datum/ai_holder/simple_mob/ranged/astral_collective @@ -67,6 +69,7 @@ vore_pounce_maxhealth = 100 vore_standing_too = TRUE unacidable = TRUE + devourable = FALSE movement_cooldown = 0 @@ -120,7 +123,7 @@ /mob/living/simple_mob/humanoid/astral_collective/Initialize(mapload) . = ..() - expirmental = rand(1,7) + expirmental = rand(1,4) expirmentresult() /datum/modifier/astralcollect_swift @@ -138,11 +141,8 @@ holder.adjustCloneLoss(-8) /datum/modifier/astralcollect_titan - max_health_percent = 2 - slowdown = 2 - -/datum/modifier/astralcollect_armour - incoming_damage_percent = 0.7 + max_health_percent = 1.5 + slowdown = 3 /datum/modifier/astralcollect_mistake mob_overlay_state = "poisoned" @@ -152,39 +152,29 @@ /datum/modifier/astralcollect_solar mob_overlay_state = "red_electricity_constant" - incoming_brute_damage_percent = 2 - incoming_fire_damage_percent = 0.3 + incoming_fire_damage_percent = 0.7 /datum/modifier/astralcollect_lunar mob_overlay_state = "blue_electricity_constant" - incoming_brute_damage_percent = 0.3 - incoming_fire_damage_percent = 2 + incoming_brute_damage_percent = 0.7 + +/datum/modifier/aura/astralcollect_church + mob_overlay_state = "redspace_aura" + incoming_brute_damage_percent = 0.6 + incoming_fire_damage_percent = 0.6 /mob/living/simple_mob/humanoid/astral_collective/proc/expirmentresult() switch(expirmental) if(1) add_modifier(/datum/modifier/astralcollect_swift, null, src) - size_multiplier -= 0.3 + size_multiplier -= 0.4 if(2) add_modifier(/datum/modifier/astralcollect_regen, null, src) if(3) add_modifier(/datum/modifier/astralcollect_titan, null, src) - size_multiplier += 0.6 + size_multiplier += 0.5 if(4) - add_modifier(/datum/modifier/astralcollect_armour, null, src) - size_multiplier += 0.3 - if(5) add_modifier(/datum/modifier/astralcollect_mistake, null, src) - if(6) - add_modifier(/datum/modifier/astralcollect_solar, null, src) - if(7) - add_modifier(/datum/modifier/astralcollect_lunar, null, src) - if(8) - ai_holder_type = /datum/ai_holder/hostile/ranged/robust - if(9) - ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax - if(10) - projectile_dispersion = 10 /datum/ai_holder/simple_mob/ranged/astral_collective pointblank = TRUE @@ -200,7 +190,6 @@ holder.IMove(get_step(holder, pick(GLOB.alldirs))) holder.face_atom(A) - /datum/ai_holder/simple_mob/ranged/astral_collective/post_ranged_attack(atom/A) holder.IMove(get_step(holder, pick(GLOB.alldirs))) holder.face_atom(A) @@ -215,7 +204,6 @@ holder.IMove(get_step(holder, pick(GLOB.alldirs))) holder.face_atom(A) - /datum/ai_holder/simple_mob/melee/evasive/astral_collective/post_special_attack(atom/A) holder.IMove(get_step(holder, pick(GLOB.alldirs))) holder.face_atom(A) @@ -236,16 +224,16 @@ special_attack_cooldown = 7 SECONDS special_attack_min_range = 0 - special_attack_max_range = 4 + special_attack_max_range = 2 /mob/living/simple_mob/humanoid/astral_collective/purity/do_special_attack(atom/A) playsound(src, 'sound/effects/ghost2.ogg', 20, 1) - for(var/mob/living/M in orange(src, 4)) + for(var/mob/living/M in orange(src, 2)) if(M.get_ear_protection() == 0) M.Confuse(10) -//the ranged mobs +//the basic ranged mobs /mob/living/simple_mob/humanoid/astral_collective/ranged name = "Astral Collective Unit" projectile_accuracy = 10 @@ -254,25 +242,31 @@ reload_max = 7 reload_time = 1.5 SECONDS ranged_cooldown = 65 + projectiletype = /obj/item/projectile/energy/astral_collective/basic + +/mob/living/simple_mob/humanoid/astral_collective/ranged/do_special_attack(atom/A) + switch(expirmental) + if(1) + burn_beam(A) + if(2) + heal_beam(A) + if(3) + brute_beam(A) + if(4) + adjustBruteLoss(-40) + adjustFireLoss(-40) //snake creature /mob/living/simple_mob/humanoid/astral_collective/ranged/noodle desc = "A naga wrapped up in strange glowing armour." icon_state = "noodle" icon_living = "noodle" - projectiletype = /obj/item/projectile/energy/astral_collective/anti_mecha - -/mob/living/simple_mob/humanoid/astral_collective/ranged/noodle/do_special_attack(atom/A) - if((health / maxHealth) <= 0.3) - alpha = 180 - teleport_self(A) //taur creature /mob/living/simple_mob/humanoid/astral_collective/ranged/taur desc = "A quadrapel creature with expirmental gear." icon_state = "taur" icon_living = "taur" - projectiletype = /obj/item/projectile/energy/astral_collective/armour_breaker health = 125 maxHealth = 125 @@ -280,28 +274,13 @@ reload_max = 15 reload_time = 3.5 SECONDS ranged_cooldown = 85 - movement_cooldown = 0 - -/mob/living/simple_mob/humanoid/astral_collective/ranged/taur/do_special_attack(atom/A) - expirmental = rand(1,5) - switch(expirmental) - if(1) - teleport_attack(A) - if(2) - gravity_surge(A) - if(3) - air_strike(A) - if(4) - repair_self(A) - if(5) - teleport_self(A) + movement_cooldown = 1 //teshari /mob/living/simple_mob/humanoid/astral_collective/ranged/tesh desc = "A teshari contained within prototype equipment." icon_state = "tesh" icon_living = "tesh" - projectiletype = /obj/item/projectile/energy/astral_collective/particle health = 50 maxHealth = 50 @@ -311,45 +290,28 @@ ranged_cooldown = 40 movement_cooldown = -1 -/mob/living/simple_mob/humanoid/astral_collective/ranged/tesh/do_special_attack(atom/A) - if((health / maxHealth) <= 0.3) - visible_message(span_boldwarning(span_orange("The teshari holds up a grenade."))) - addtimer(CALLBACK(src, PROC_REF(selfexplode_attack), A), 1.5 SECONDS, TIMER_DELETE_ME) - else - teleport_attack(A) - //cannine /mob/living/simple_mob/humanoid/astral_collective/ranged/wolf desc = "A humanoid armored cannine folk." icon_state = "wolf" icon_living = "wolf" - projectiletype = /obj/item/projectile/energy/astral_collective/green special_attack_cooldown = 13 SECONDS reload_max = 5 reload_time = 0.5 SECONDS ranged_cooldown = 70 -/mob/living/simple_mob/humanoid/astral_collective/ranged/wolf/do_special_attack(atom/A) - gravity_surge(A) - //lizard /mob/living/simple_mob/humanoid/astral_collective/ranged/lizard desc = "A humanoid heavily armoured lizardfolk." icon_state = "breacher" icon_living = "breacher" - projectiletype = /obj/item/projectile/energy/astral_collective/searing health = 150 maxHealth = 150 needs_reload = FALSE special_attack_cooldown = 20 SECONDS ranged_cooldown = 90 - movement_cooldown = 3 - -/mob/living/simple_mob/humanoid/astral_collective/ranged/lizard/do_special_attack(atom/A) - if((health / maxHealth) <= 0.3) - repair_self(A) - air_strike(A) + movement_cooldown = 5 //zaddat /mob/living/simple_mob/humanoid/astral_collective/ranged/zaddat @@ -360,9 +322,6 @@ special_attack_cooldown = 6 SECONDS ranged_cooldown = 30 -/mob/living/simple_mob/humanoid/astral_collective/ranged/zaddat/do_special_attack(atom/A) - projectiletype = pick(/obj/item/projectile/energy/astral_collective/anti_mecha, /obj/item/projectile/energy/astral_collective/armour_breaker, /obj/item/projectile/energy/astral_collective/searing, /obj/item/projectile/energy/astral_collective/green, /obj/item/projectile/energy/astral_collective/particle) - /mob/living/simple_mob/humanoid/astral_collective/ranged/zaddat/bullet_act(var/obj/item/projectile/Proj) if(!Proj) return @@ -374,13 +333,38 @@ else ..() +/mob/living/simple_mob/humanoid/astral_collective/proc/heal_beam(atom/target) + if(!target) + return FALSE + for(var/mob/living/L in orange(src, 5)) + if(IIsAlly(L)) + Beam(L, icon_state = "g_beam", time = 2.5 SECONDS, maxdistance = INFINITY) + L.adjustBruteLoss(-30) + L.adjustFireLoss(-30) + +/mob/living/simple_mob/humanoid/astral_collective/proc/burn_beam(atom/target) + if(!target) + return FALSE + for(var/mob/living/L in orange(src, 5)) + if(IIsAlly(L)) + Beam(L, icon_state = "g_beam", time = 2.5 SECONDS, maxdistance = INFINITY) + L.add_modifier(/datum/modifier/astralcollect_solar, null, src) + +/mob/living/simple_mob/humanoid/astral_collective/proc/brute_beam(atom/target) + if(!target) + return FALSE + for(var/mob/living/L in orange(src, 5)) + if(IIsAlly(L)) + Beam(L, icon_state = "g_beam", time = 2.5 SECONDS, maxdistance = INFINITY) + L.add_modifier(/datum/modifier/astralcollect_lunar, null, src) + /mob/living/simple_mob/humanoid/astral_collective/proc/teleport_attack(atom/target) // Teleport attack. if(!target) to_chat(src, span_warning("There's nothing to teleport to.")) return FALSE - var/list/nearby_things = range(2, src) + var/list/nearby_things = range(5, src) var/list/valid_turfs = list() // All this work to just go to a non-dense tile. @@ -402,75 +386,146 @@ do_teleport(target, target_turf, channel = TELEPORT_CHANNEL_QUANTUM) -/mob/living/simple_mob/humanoid/astral_collective/proc/selfexplode_attack(atom/target) +//specialized units +//This names are wierd but corespond to the differing branches +//Body is the security branches. Their goal is to effecitly kill you, or CC via area dsamage +/mob/living/simple_mob/humanoid/astral_collective/body + name = "Astral Collective Enforcement" + projectiletype = /obj/item/projectile/energy/astral_collective/basic + health = 125 + maxHealth = 125 + +/mob/living/simple_mob/humanoid/astral_collective/body/dagger + projectiletype = /obj/item/projectile/energy/astral_collective/dagger + special_attack_cooldown = 15 SECONDS + icon_state = "blade_tosser" + icon_living = "blade_tosser" + +/mob/living/simple_mob/humanoid/astral_collective/body/dagger/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(prob(50)) + teleport_attack(src) + ..() + +/mob/living/simple_mob/humanoid/astral_collective/body/dagger/bullet_act(var/obj/item/projectile/Proj) + if(prob(50)) + teleport_attack(src) + ..() + +/mob/living/simple_mob/humanoid/astral_collective/body/dagger/do_special_attack(atom/A) + for(var/mob/living/L in orange(src, 7)) + if(L.stat != DEAD && !IIsAlly(L)) + L.add_modifier(/datum/modifier/mmo_drop/eclipse_dagger, 3, src) + +/mob/living/simple_mob/humanoid/astral_collective/body/juggernaught + icon_state = "breaker" + icon_living = "breaker" + special_attack_min_range = 0 + special_attack_max_range = 3 + special_attack_cooldown = 18 SECONDS + +/mob/living/simple_mob/humanoid/astral_collective/body/juggernaught/do_special_attack(atom/A) + playsound(src, 'sound/effects/ghost2.ogg', 20, 1) + for(var/mob/living/M in orange(src, 3)) + if(M.get_ear_protection() == 0) + M.Stun(0.5) + +//The mind is the science branch. Their goal is to limit or disable your options +/mob/living/simple_mob/humanoid/astral_collective/mind + name = "Astral Collective Researcher" + health = 125 + maxHealth = 125 + +/mob/living/simple_mob/humanoid/astral_collective/mind/gravity + icon_state = "space" + icon_living = "space" + projectiletype = /obj/item/projectile/energy/astral_collective/basic + special_attack_cooldown = 10 SECONDS + +//Gravity shield. Hit it with melee, and a sudden gravity surge may tear your weapon to the ground +/mob/living/simple_mob/humanoid/astral_collective/mind/gravity/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(O.force) + if(prob(30)) + visible_message(span_boldwarning(span_orange("[O] is pulled to the ground!."))) + user.drop_item() + return + else + ..() + else + ..() + +/mob/living/simple_mob/humanoid/astral_collective/mind/gravity/do_special_attack(atom/A) + for(var/mob/living/L in orange(src, 7)) //despite the attack range being 6 we do 7 so folks don't wander in then get confused why they are getting hit by it + Beam(L, icon_state = "chain", time = 1.5 SECONDS, maxdistance = 6) + addtimer(CALLBACK(src, PROC_REF(super_move), A), 2.5 SECONDS, TIMER_DELETE_ME) + +/mob/living/simple_mob/humanoid/astral_collective/mind/gravity/proc/super_move(atom/target) if(!target) return FALSE - explosion(src.loc, 1, 1, 1, 1) + for(var/mob/living/L in orange(src, 6)) + L.throw_at(get_edge_target_turf(L, L.dir), rand(2,6), 10) -/mob/living/simple_mob/humanoid/astral_collective/proc/gravity_surge(atom/target) - if(!target) - return FALSE - playsound(src, 'sound/weapons/wave.ogg', 75, 1) - for(target in range(7, src)) - target.singularity_pull(src, 3) +/mob/living/simple_mob/humanoid/astral_collective/mind/fire + desc = "An armored vox wielding a flamethrower. The phoron tank seems explosive." + icon_state = "flamer" + icon_living = "flamer" + projectiletype = /obj/item/projectile/energy/astral_collective/fire -/mob/living/simple_mob/humanoid/astral_collective/proc/air_strike(atom/target) - if(!target) - return FALSE - for(var/mob/living/L in orange(src, 14)) - if(IIsAlly(L)) - Beam(L, icon_state = "g_beam", time = 2.5 SECONDS, maxdistance = INFINITY) - L.adjustBruteLoss(-30) - L.adjustFireLoss(-30) +/mob/living/simple_mob/humanoid/astral_collective/mind/fire/death() + explosion(src.loc, 0, 2, 0, 0) + return ..() -/mob/living/simple_mob/humanoid/astral_collective/proc/repair_self(atom/target) - if(!target) - return FALSE - adjustBruteLoss(-70) - adjustFireLoss(-70) - adjustToxLoss(-70) - adjustOxyLoss(-70) - adjustCloneLoss(-70) +//The soul is the relogious branch. Their goal is to limit your offense +/mob/living/simple_mob/humanoid/astral_collective/soul + name = "Astral Collective Soulspeaker" //I swear if anyone takes this name litterally + health = 150 + maxHealth = 150 -/mob/living/simple_mob/humanoid/astral_collective/proc/teleport_self(atom/A) - // Teleport attack. - if(!A) - to_chat(src, span_warning("There's nothing to teleport to.")) - return FALSE +/mob/living/simple_mob/humanoid/astral_collective/soul/spear_bearer + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/astral_collective + melee_damage_lower = 27 //25ish with explo voidsuit + melee_damage_upper = 27 + attack_armor_pen = 40 + melee_attack_delay = 1.5 SECONDS + special_attack_cooldown = 10 SECONDS + icon_state = "clock_cat_shield" + icon_living = "clock_cat_shield" + var/barrier_health = 3 - var/list/nearby_things = range(4, A) - var/list/valid_turfs = list() +/mob/living/simple_mob/humanoid/astral_collective/soul/spear_bearer/do_special_attack(atom/A) + barrier_health ++ + icon_state = "clock_cat_shield" - // 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) +/mob/living/simple_mob/humanoid/astral_collective/soul/spear_bearer/bullet_act(var/obj/item/projectile/Proj) + if(!Proj) + return + if(barrier_health > 0) + barrier_health -- + visible_message(span_boldwarning(span_orange("[Proj] is blocked by the shield."))) + if(Proj.firer) + ai_holder.react_to_attack(Proj.firer) + if(barrier_health == 0) + icon_state = "clock_cat" + return + else + ..() + +/mob/living/simple_mob/humanoid/astral_collective/soul/shield_projector + projectiletype = /obj/item/projectile/energy/astral_collective/spear + special_attack_cooldown = 40 SECONDS + icon_state = "clock_sergal" + icon_living = "clock_sergal" + +/mob/living/simple_mob/humanoid/astral_collective/soul/shield_projector/do_special_attack(atom/A) + adjustBruteLoss(-200) + adjustFireLoss(-200) + +/mob/living/simple_mob/humanoid/astral_collective/soul/shield_projector/handle_special() + if(stat != DEAD) + protection_aura() + ..() + +/mob/living/simple_mob/humanoid/astral_collective/soul/shield_projector/proc/protection_aura() + for(var/mob/living/L in view(src, 5)) + if(L.stat == DEAD || !IIsAlly(L)) 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_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() + L.add_modifier(/datum/modifier/aura/astralcollect_church, null, src) diff --git a/modular_chomp/code/modules/projectiles/precursor/eclipse.dm b/modular_chomp/code/modules/projectiles/precursor/eclipse.dm index 2e0a758ca8..3bf9c6f7cc 100644 --- a/modular_chomp/code/modules/projectiles/precursor/eclipse.dm +++ b/modular_chomp/code/modules/projectiles/precursor/eclipse.dm @@ -144,33 +144,27 @@ /obj/item/projectile/energy/astral_collective name = "abnormal energy" speed = 3 - damage = 28 //roughly 25 with intended armour - damage_type = BURN //BRUTE, BURN, TOX, OXY, CLONE, HALLOSS, ELECTROCUTE, BIOACID, SEARING are the only things that should be in here - check_armour = "laser" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb //Cael - bio and rad are also valid + damage = 28 + damage_type = BURN + icon = 'modular_chomp/icons/obj/guns/precursor/eclipse.dmi' + icon_state = "laser" + check_armour = "laser" -/obj/item/projectile/energy/astral_collective/anti_mecha - damage_type = BIOACID - icon_state = "declone" - -/obj/item/projectile/energy/astral_collective/armour_breaker - damage = 10 - dephasing = TRUE - hits_phased = TRUE - icon_state = "fuel-deuterium" - penetrating = 10 - armor_penetration = 100 - -/obj/item/projectile/energy/astral_collective/searing +/obj/item/projectile/energy/astral_collective/basic damage_type = SEARING - icon_state = "bolter" -/obj/item/projectile/energy/astral_collective/green - icon_state = "energy" - irradiate = 40 +/obj/item/projectile/energy/astral_collective/spear + icon_state = "spear" + damage = 20 + armor_penetration = 30 -/obj/item/projectile/energy/astral_collective/particle - damage = 1 - armor_penetration = 100 - icon_state = "particle" - incendiary = 1 +/obj/item/projectile/energy/astral_collective/fire + icon_state = "fire" + damage = 10 + incendiary = 2 flammability = 3 + +/obj/item/projectile/energy/astral_collective/dagger + damage = 8 + armor_penetration = 60 + icon_state = "dagger" diff --git a/modular_chomp/icons/mob/eclipse.dmi b/modular_chomp/icons/mob/eclipse.dmi index 981efe3705..783b802a11 100644 Binary files a/modular_chomp/icons/mob/eclipse.dmi and b/modular_chomp/icons/mob/eclipse.dmi differ diff --git a/modular_chomp/icons/mob/tribal_gear.dmi b/modular_chomp/icons/mob/tribal_gear.dmi index 3bc918dc3e..920cba13eb 100644 Binary files a/modular_chomp/icons/mob/tribal_gear.dmi and b/modular_chomp/icons/mob/tribal_gear.dmi differ diff --git a/modular_chomp/icons/obj/guns/precursor/eclipse.dmi b/modular_chomp/icons/obj/guns/precursor/eclipse.dmi index 66e9ecafa9..e15f077322 100644 Binary files a/modular_chomp/icons/obj/guns/precursor/eclipse.dmi and b/modular_chomp/icons/obj/guns/precursor/eclipse.dmi differ diff --git a/modular_chomp/icons/obj/guns/precursor/lefthand.dmi b/modular_chomp/icons/obj/guns/precursor/lefthand.dmi index 7c48a3f584..0b8149e907 100644 Binary files a/modular_chomp/icons/obj/guns/precursor/lefthand.dmi and b/modular_chomp/icons/obj/guns/precursor/lefthand.dmi differ diff --git a/modular_chomp/icons/obj/guns/precursor/righthand.dmi b/modular_chomp/icons/obj/guns/precursor/righthand.dmi index 8078690f39..09bc3ab500 100644 Binary files a/modular_chomp/icons/obj/guns/precursor/righthand.dmi and b/modular_chomp/icons/obj/guns/precursor/righthand.dmi differ diff --git a/modular_chomp/maps/common_submaps/overmap/planets/tyr/tyr.dmm b/modular_chomp/maps/common_submaps/overmap/planets/tyr/tyr.dmm index 223a4969c4..78f8dbbfcf 100644 --- a/modular_chomp/maps/common_submaps/overmap/planets/tyr/tyr.dmm +++ b/modular_chomp/maps/common_submaps/overmap/planets/tyr/tyr.dmm @@ -492,6 +492,12 @@ }, /turf/simulated/shuttle/floor/voidcraft/tyr, /area/planet/tyr/shuttles/five) +"bR" = ( +/obj/structure/safe/floor, +/obj/item/storage/belt/holding, +/obj/item/storage/pouch/holding, +/turf/simulated/floor/tiled/old_cargo/beige, +/area/planet/tyr/ac_mainbase) "bS" = ( /obj/machinery/computer, /turf/simulated/shuttle/floor/voidcraft/tyr, @@ -538,6 +544,10 @@ /obj/structure/frame, /turf/simulated/shuttle/floor/voidcraft/tyr, /area/planet/tyr/shuttles/eleven) +"cc" = ( +/mob/living/simple_mob/humanoid/astral_collective/body/dagger, +/turf/simulated/floor/tiled/old_cargo/blue, +/area/planet/tyr/ac_mainbase) "cd" = ( /obj/item/circuitboard/teleporter_station, /obj/structure/frame, @@ -653,6 +663,14 @@ /obj/item/radio, /turf/simulated/floor, /area/planet/tyr/shuttles/one) +"cy" = ( +/mob/living/simple_mob/humanoid/astral_collective/body/juggernaught, +/turf/simulated/floor/tiled/old_cargo/blue, +/area/planet/tyr/ac_mainbase) +"cz" = ( +/mob/living/simple_mob/humanoid/astral_collective/soul/spear_bearer, +/turf/simulated/floor/tiled/old_cargo/blue, +/area/planet/tyr/ac_mainbase) "cA" = ( /obj/structure/table/steel, /obj/item/storage/box/monkeycubes/sparracubes, @@ -732,6 +750,10 @@ /obj/structure/table/rack, /turf/simulated/floor/tiled/purple, /area/planet/tyr/ac_mainbase) +"cN" = ( +/mob/living/simple_mob/humanoid/astral_collective/soul/shield_projector, +/turf/simulated/floor/tiled/old_cargo/yellow, +/area/planet/tyr/ac_mainbase) "cO" = ( /obj/machinery/cryopod/robot/door/gateway/quiet, /turf/simulated/floor, @@ -742,6 +764,10 @@ }, /turf/simulated/floor, /area/planet/tyr/shuttles/one) +"cQ" = ( +/mob/living/simple_mob/humanoid/astral_collective/mind/gravity, +/turf/simulated/floor/tiled/old_cargo/purple, +/area/planet/tyr/ac_mainbase) "cR" = ( /obj/structure/cable{ icon_state = "1-2" @@ -783,6 +809,10 @@ }, /turf/simulated/floor, /area/planet/tyr/shuttles/one) +"cW" = ( +/mob/living/simple_mob/humanoid/astral_collective/mind/fire, +/turf/simulated/floor/tiled/old_cargo/red, +/area/planet/tyr/ac_mainbase) "cX" = ( /obj/structure/cable{ icon_state = "0-4" @@ -793,6 +823,11 @@ }, /turf/simulated/floor, /area/planet/tyr/shuttles/one) +"cY" = ( +/obj/structure/table/darkglass, +/obj/item/shield/tyr_shield, +/turf/simulated/shuttle/floor/alienplating, +/area/planet/tyr/precursorruins/hallway) "cZ" = ( /obj/structure/cable{ icon_state = "1-8" @@ -823,6 +858,11 @@ }, /turf/simulated/floor, /area/planet/tyr/shuttles/one) +"dd" = ( +/obj/structure/table/darkglass, +/obj/item/melee/energy/tyr_chainsaw, +/turf/simulated/shuttle/floor/alienplating, +/area/planet/tyr/precursorruins/hallway) "de" = ( /turf/simulated/floor/wood, /area/planet/tyr/shuttles/four) @@ -841,6 +881,15 @@ "dh" = ( /turf/simulated/shuttle/floor/voidcraft/tyr, /area/planet/tyr/ship_graveyard) +"di" = ( +/obj/structure/railing/overhang/grey{ + dir = 8 + }, +/obj/structure/table/darkglass, +/obj/item/shield/tyr_shield, +/obj/item/melee/energy/tyr_chainsaw, +/turf/simulated/shuttle/floor/alienplating, +/area/planet/tyr/precursorruins/hallway) "dj" = ( /obj/structure/cable{ icon_state = "2-8" @@ -983,6 +1032,7 @@ /area/planet/tyr/precursorruins/hallway) "fe" = ( /obj/structure/table/marble, +/obj/item/paper/tyr_notes/astral_e, /turf/simulated/floor/tiled/old_cargo/white, /area/planet/tyr/ac_mainbase) "ff" = ( @@ -1463,8 +1513,8 @@ /area/planet/tyr/precursorruins/hallway) "jA" = ( /obj/structure/prop/tyr_elevator{ - descendx = 162; - descendy = 249 + descendx = 245; + descendy = 245 }, /turf/simulated/shuttle/floor/black, /area/planet/tyr/precursorruins/hallway) @@ -1826,15 +1876,10 @@ /obj/item/melee/cultblade, /turf/simulated/floor/tiled/old_cargo/blue, /area/planet/tyr/ac_mainbase) -"lU" = ( -/mob/living/simple_mob/humanoid/astral_collective/ranged/taur, -/turf/simulated/floor/tiled/old_cargo/beige, -/area/planet/tyr/ac_mainbase) "lV" = ( /obj/structure/table/marble, -/obj/structure/safe/floor, -/obj/item/gun/energy/medigun, -/obj/item/storage/belt/holding, +/obj/item/shield/tyr_shield, +/obj/item/melee/energy/tyr_chainsaw, /turf/simulated/floor/tiled/old_cargo/beige, /area/planet/tyr/ac_mainbase) "lW" = ( @@ -9467,7 +9512,7 @@ pd pM pF pq -pq +di pq po pm @@ -61426,7 +61471,7 @@ gz gz aL lW -lH +bR lR aL gz @@ -61942,7 +61987,7 @@ me aL lH lG -lU +lH lG lH aL @@ -62200,7 +62245,7 @@ mf aL lQ lH -lG +cc lH lQ aL @@ -62716,7 +62761,7 @@ lG lH lG lH -lG +cy lH lG lH @@ -63454,7 +63499,7 @@ nc np np np -nc +cN np np np @@ -65505,7 +65550,7 @@ gI gI og ob -gI +cW gI aL gK @@ -65971,7 +66016,7 @@ oX ik ik ik -oX +dd ac ac ac @@ -66218,14 +66263,14 @@ ac ac ac oX -oX +dd oX ac ac ac ac ac -oX +cY ik py ik @@ -66234,7 +66279,7 @@ ac ac ac ac -oX +dd ik ik ik @@ -67010,7 +67055,7 @@ ac ac ac oX -oX +cY oX ac ac @@ -67251,7 +67296,7 @@ ac ac oX oX -oX +cY ac ac ac @@ -68098,7 +68143,7 @@ np np np lH -np +cQ np np np @@ -68293,7 +68338,7 @@ oX ik ik ik -oX +dd ac ac ac @@ -68547,7 +68592,7 @@ ac ac ac ac -oX +cY ik pB ik @@ -68647,7 +68692,7 @@ aL mc mp lN -lG +cz mb lG lM