diff --git a/modular_iris/code/datums/cinematics/_cinematic_iris.dm b/modular_iris/code/datums/cinematics/_cinematic_iris.dm new file mode 100644 index 000000000000..beb0bb29b2ac --- /dev/null +++ b/modular_iris/code/datums/cinematics/_cinematic_iris.dm @@ -0,0 +1,48 @@ +/datum/cinematic/chosm_summon + +/datum/cinematic/chosm_summon/play_cinematic() + cleanup_time = 5 SECONDS + screen.icon = 'modular_iris/code/datums/cinematics/delay.dmi' + screen.icon_state = "delay" + play_cinematic_sound(sound('modular_iris/sound/daemons/cinematics/something_is_terribly_wrong.ogg')) + stoplag(3.0 SECONDS) + screen.icon = 'modular_iris/code/datums/cinematics/fading_stars.dmi' + play_cinematic_sound(sound('modular_iris/sound/daemons/cinematics/chosm_summon_rumble.ogg')) + screen.icon_state = "stars_fading" + stoplag(8.0 SECONDS) + play_cinematic_sound(sound('modular_iris/sound/daemons/cinematics/chosm_atmosphere.ogg')) + play_cinematic_sound(sound('modular_iris/sound/daemons/cinematics/chosm_rumbling.ogg')) + screen.icon = 'modular_iris/code/datums/cinematics/chosmic_tide.dmi' + screen.icon_state = "tide" + stoplag(2.0 SECONDS) + screen.icon = 'modular_iris/code/datums/cinematics/chosm_pause.dmi' + screen.icon_state = "pause" + + +/datum/cinematic/chosm_victory + +/datum/cinematic/chosm_victory/play_cinematic() + cleanup_time = 6 SECONDS + screen.icon = 'modular_iris/code/datums/cinematics/chosm_win.dmi' + screen.icon_state = "win" + play_cinematic_sound(sound('modular_iris/sound/daemons/cinematics/chosmwin.ogg')) + play_cinematic_sound(sound('modular_iris/sound/daemons/cinematics/chosm_rumbling.ogg')) + + +/datum/cinematic/angel_arrive + +/datum/cinematic/angel_arrive/play_cinematic() + cleanup_time = 3 SECONDS + screen.icon = 'modular_iris/code/datums/cinematics/angel_arrive.dmi' + screen.icon_state = "arrive" + play_cinematic_sound(sound('modular_iris/sound/daemons/cinematics/emissary_arrival.ogg')) + + +/datum/cinematic/angel_victory + +/datum/cinematic/angel_victory/play_cinematic() + cleanup_time = 8 SECONDS + screen.icon = 'modular_iris/code/datums/cinematics/angel_victory.dmi' + screen.icon_state = "victory" + stoplag(1.0 SECONDS) + play_cinematic_sound(sound('modular_iris/sound/daemons/cinematics/angel_laser.ogg')) diff --git a/modular_iris/code/datums/cinematics/angel_arrive.dmi b/modular_iris/code/datums/cinematics/angel_arrive.dmi new file mode 100644 index 000000000000..017a8bb6ea32 Binary files /dev/null and b/modular_iris/code/datums/cinematics/angel_arrive.dmi differ diff --git a/modular_iris/code/datums/cinematics/angel_victory.dmi b/modular_iris/code/datums/cinematics/angel_victory.dmi new file mode 100644 index 000000000000..e2f6ccae9c2b Binary files /dev/null and b/modular_iris/code/datums/cinematics/angel_victory.dmi differ diff --git a/modular_iris/code/datums/cinematics/chosm_freeze.dmi b/modular_iris/code/datums/cinematics/chosm_freeze.dmi new file mode 100644 index 000000000000..9bfc5d91f692 Binary files /dev/null and b/modular_iris/code/datums/cinematics/chosm_freeze.dmi differ diff --git a/modular_iris/code/datums/cinematics/chosm_pause.dmi b/modular_iris/code/datums/cinematics/chosm_pause.dmi new file mode 100644 index 000000000000..bda52c78fb50 Binary files /dev/null and b/modular_iris/code/datums/cinematics/chosm_pause.dmi differ diff --git a/modular_iris/code/datums/cinematics/chosm_win.dmi b/modular_iris/code/datums/cinematics/chosm_win.dmi new file mode 100644 index 000000000000..9419bb1948ea Binary files /dev/null and b/modular_iris/code/datums/cinematics/chosm_win.dmi differ diff --git a/modular_iris/code/datums/cinematics/chosmic_tide.dmi b/modular_iris/code/datums/cinematics/chosmic_tide.dmi new file mode 100644 index 000000000000..c11193a8cce8 Binary files /dev/null and b/modular_iris/code/datums/cinematics/chosmic_tide.dmi differ diff --git a/modular_iris/code/datums/cinematics/delay.dmi b/modular_iris/code/datums/cinematics/delay.dmi new file mode 100644 index 000000000000..15072e255267 Binary files /dev/null and b/modular_iris/code/datums/cinematics/delay.dmi differ diff --git a/modular_iris/code/datums/cinematics/fading_stars.dmi b/modular_iris/code/datums/cinematics/fading_stars.dmi new file mode 100644 index 000000000000..78cd517dee0f Binary files /dev/null and b/modular_iris/code/datums/cinematics/fading_stars.dmi differ diff --git a/modular_iris/code/game/objects/effects/membrane_structures.dm b/modular_iris/code/game/objects/effects/membrane_structures.dm new file mode 100644 index 000000000000..5ce21ce2064f --- /dev/null +++ b/modular_iris/code/game/objects/effects/membrane_structures.dm @@ -0,0 +1,126 @@ +#define SPIDER_WEB_TINT "web_colour_tint" + +/obj/structure/chosm + name = "membrane" + icon = 'modular_iris/icons/obj/smooth_structures/sinuous_tissue.dmi' + desc = "A sinuous dark-tyrian mass of interwoven tissue." + anchored = TRUE + density = FALSE + max_integrity = 5 + +/obj/structure/chosm/Initialize(mapload) + . = ..() + AddElement(/datum/element/atmos_sensitive, mapload) + ADD_TRAIT(src, TRAIT_INVERTED_DEMOLITION, INNATE_TRAIT) + //transform = transform.Scale(0.8, 0.8) + +/obj/structure/chosm/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) + if(damage_type == BURN)//the stickiness of the membrane mutes all attack sounds except fire damage type + playsound(loc, 'sound/items/tools/welder.ogg', 100, TRUE) + +/obj/structure/chosm/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) + if(damage_flag == MELEE) + switch(damage_type) + if(BURN) + damage_amount *= 0.25 + if(BRUTE) + damage_amount *= 1.25 + return ..() + +/obj/structure/chosm/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return exposed_temperature > 350 // Remove + +/obj/structure/chosm/atmos_expose(datum/gas_mixture/air, exposed_temperature) + take_damage(5, BURN, 0, 0) // Remove + +/obj/structure/chosm/membrane + layer = ABOVE_OPEN_TURF_LAYER + plane = FLOOR_PLANE + icon = 'modular_iris/icons/obj/smooth_structures/sinuous_tissue.dmi' + base_icon_state = "tissue" + icon_state = "tissue-0" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = null + canSmoothWith = SMOOTH_GROUP_WALLS + ///Whether or not the web is from the genetics power + var/genetic = FALSE // Definitely Remove probably. + ///Whether or not the web is a sealed web + var/sealed = FALSE // Remove + ///Do we need to offset this based on a sprite frill? + var/has_frill = TRUE // What? Try to remove I guess? + /// Chance that someone will get stuck when trying to cross this tile + var/stuck_chance = 50 + /// Chance that a bullet will hit this instead of flying through it + var/projectile_stuck_chance = 30 + +/obj/structure/chosm/membrane/Initialize(mapload) + // Offset on init so that they look nice in the map editor + //transform = transform.Scale(0.5, 0.5) + if (has_frill) + pixel_x = -9 + pixel_y = -9 + return ..() + +/obj/structure/chosm/membrane/Destroy() + playsound(src.loc, 'modular_iris/sound/daemons/membrane_death.ogg', 50, TRUE) + return ..() + + +/obj/structure/chosm/membrane/attack_hand(mob/user, list/modifiers) + .= ..() + if(.) + return + if(!HAS_TRAIT(user, TRAIT_WEB_WEAVER)) + return + loc.balloon_alert_to_viewers("spooling...") + if(!do_after(user, 2 SECONDS)) + loc.balloon_alert(user, "interrupted!") + return + qdel(src) + var/obj/item/stack/sheet/cloth/woven_cloth = new /obj/item/stack/sheet/cloth + user.put_in_hands(woven_cloth) + +/obj/structure/chosm/membrane/CanAllowThrough(atom/movable/mover, border_dir) + . = ..() + if(genetic) // Remove + return + if(sealed) + return FALSE + if(isliving(mover)) + if(HAS_TRAIT(mover, TRAIT_WEB_SURFER)) + return TRUE + if(mover.pulledby && HAS_TRAIT(mover.pulledby, TRAIT_WEB_SURFER)) + return TRUE + if(prob(stuck_chance)) + stuck_react(mover) + return FALSE + return . + if(isprojectile(mover)) + return prob(projectile_stuck_chance) + return . + +/// Show some feedback when you can't pass through something +/obj/structure/chosm/membrane/proc/stuck_react(atom/movable/stuck_guy) + loc.balloon_alert(stuck_guy, "stuck in membrane!") + stuck_guy.Shake(duration = 0.1 SECONDS) + +//Actual Tissue that is spawned in-game +/obj/structure/chosm/membrane/sinuous_tissue + layer = ABOVE_OPEN_TURF_LAYER + plane = FLOOR_PLANE + icon = 'modular_iris/icons/obj/smooth_structures/sinuous_tissue.dmi' // Change later + base_icon_state = "tissue" + icon_state = "tissue-0" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = null + canSmoothWith = SMOOTH_GROUP_WALLS + + +/obj/structure/chosm/membrane/sinuous_tissue/Initialize(mapload) + // Offset on init so that they look nice in the map editor + if (has_frill) + pixel_x = -9 + pixel_y = -9 + return ..() + + diff --git a/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/angel.dm b/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/angel.dm new file mode 100644 index 000000000000..be89a48cf79b --- /dev/null +++ b/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/angel.dm @@ -0,0 +1,34 @@ +/mob/living/basic/daemons/angel + name = "An Emissary" + desc = "Whatever this is, you cant stop looking at it -- No matter which angle or perspective you perceive it from, it is always facing towards you. A breadth of wings spreads outwards from a coalesced darkness. Light doth not shine where God shies its visage." + icon = 'modular_iris/icons/mob/simple/angel.dmi' + icon_state = "idle" + icon_living = "idle" + icon_dead = "idle" + speed = 0. + maxHealth = 1500 + health = 1500 + obj_damage = 100 + pixel_x = -40 + pixel_y = -20 + melee_damage_lower = -100 + melee_damage_upper = -100 + max_grab = GRAB_AGGRESSIVE + faction = list(FACTION_NEUTRAL) + melee_attack_cooldown = CLICK_CD_MELEE + response_help_continuous = "pets" + response_help_simple = "pet" + speak_emote = list("sings") + initial_language_holder = /datum/language_holder/human_basic + damage_coeff = list(BRUTE = 0, BURN = 0, TOX = 0, STAMINA = 0, OXY = 0) + attack_verb_continuous = "strikes" + attack_verb_simple = "strike" + attack_sound = 'modular_iris/sound/daemons/angel_strike.ogg' + unsuitable_cold_damage = 0 + unsuitable_heat_damage = 0 + attack_vis_effect = ATTACK_EFFECT_VOID + unique_name = FALSE + max_stamina = 500 + stamina_crit_threshold = BASIC_MOB_NO_STAMCRIT + stamina_recovery = 5 + max_stamina_slowdown = 0 diff --git a/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/angel_abilities.dm b/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/angel_abilities.dm new file mode 100644 index 000000000000..1d6b5598a180 --- /dev/null +++ b/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/angel_abilities.dm @@ -0,0 +1,86 @@ + + +// Fires a Shotgun-Esque Blast of the Angel Proj +/datum/action/cooldown/mob_cooldown/projectile_attack/angel_shotgun + name = "Deliver Upon Them Divine Absolution" + button_icon = 'icons/obj/weapons/guns/ballistic.dmi' + button_icon_state = "shotgun" + desc = "Fires Absolution in a shotgun pattern." + cooldown_time = 2 SECONDS + projectile_type = /obj/projectile/angel + projectile_sound = 'modular_iris/sound/daemons/angel_deep_strike.ogg' + var/list/shot_angles = list(12.5, 7.5, 2.5, -2.5, -7.5, -12.5) + +/datum/action/cooldown/mob_cooldown/projectile_attack/angel_shotgun/attack_sequence(mob/living/firer, atom/target) + fire_shotgun(firer, target, shot_angles) + +/datum/action/cooldown/mob_cooldown/projectile_attack/angel_shotgun/proc/fire_shotgun(mob/living/firer, atom/target, list/chosen_angles) + playsound(firer, projectile_sound, 200, TRUE, 2) + for(var/spread in chosen_angles) + shoot_projectile(firer, target, null, firer, spread, null) + owner.icon_state = "hostile" // This definitely needs a check to make sure you are the proper mob for this, otherwise it breaks everyone else. + + + +/obj/projectile/angel + name = "absolution bolt" + icon = 'modular_iris/icons/mob/simple/angel_projectiles.dmi' + icon_state = "divine_bolt" + damage = 50 + armour_penetration = 100 + speed = 0.5 + damage_type = BURN + pass_flags = PASSTABLE + plane = GAME_PLANE + immobilize = 1 SECONDS + +/obj/projectile/angel/can_hit_target(atom/target, direct_target = FALSE, ignore_loc = FALSE, cross_failed = FALSE) + if(isliving(target) && target != firer) + direct_target = TRUE + return ..(target, direct_target, ignore_loc, cross_failed) + +// Fires a Resurrection Bolt +/datum/action/cooldown/mob_cooldown/projectile_attack/angel_grace + name = "Divine Essence" + button_icon = 'icons/obj/weapons/guns/projectiles.dmi' + button_icon_state = "blastwave" + desc = "Deliver Divine Essence upon a target to heal them for full." + cooldown_time = 1.5 SECONDS + projectile_type = /obj/projectile/magic/resurrection + projectile_sound = 'modular_iris/sound/daemons/angel_revival.ogg' + +/datum/action/cooldown/mob_cooldown/projectile_attack/angel_grace/Activate(atom/target_atom) + . = ..() + playsound(owner, projectile_sound, 200, TRUE, 2) + owner.visible_message(span_danger("[owner] delivers Divine Grace!")) + owner.face_atom(target_atom) + owner.icon_state = "idle" + + + + +// Fires repeatedly many Angel Bolts +/datum/action/cooldown/mob_cooldown/projectile_attack/blind_rage + name = "Divine Wrath" + button_icon = 'icons/obj/weapons/guns/energy.dmi' + button_icon_state = "kineticgun" + desc = "Fires projectiles repeatedly at a given target." + cooldown_time = 1.5 SECONDS + projectile_type = /obj/projectile/angel + projectile_sound = 'modular_iris/sound/daemons/angel_wrath.ogg' + default_projectile_spread = 45 + /// Total shot count + var/shot_count = 10 + /// Delay between shots + var/shot_delay = 0.1 SECONDS + +/datum/action/cooldown/mob_cooldown/projectile_attack/blind_rage/Activate(atom/target_atom) + . = ..() + playsound(owner, projectile_sound, 200, TRUE, 2) + owner.icon_state = "hostile" + +/datum/action/cooldown/mob_cooldown/projectile_attack/blind_rage/attack_sequence(mob/living/firer, atom/target) + for(var/i in 1 to shot_count) + shoot_projectile(firer, target, null, firer, rand(-default_projectile_spread, default_projectile_spread), null) + SLEEP_CHECK_DEATH(shot_delay, src) + playsound(owner, projectile_sound, 150, TRUE, 2) diff --git a/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/chosm_abilities.dm b/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/chosm_abilities.dm new file mode 100644 index 000000000000..284cdbabf96f --- /dev/null +++ b/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/chosm_abilities.dm @@ -0,0 +1,357 @@ +// Basic Membrane +/datum/action/cooldown/mob_cooldown/lay_membrane + name = "Produce Membrane" + desc = "Produce a membraneous film. Spread its influence." + button_icon = 'icons/mob/actions/actions_animal.dmi' // change + button_icon_state = "spider_web" + background_icon_state = "bg_alien" + overlay_icon_state = "bg_alien_border" + cooldown_time = 0 SECONDS + melee_cooldown_time = 0 + shared_cooldown = NONE + click_to_activate = FALSE + /// How long it takes to produce Membrane + var/webbing_time = 4 SECONDS + +/datum/action/cooldown/mob_cooldown/lay_membrane/Grant(mob/grant_to) + . = ..() + if (!owner) + return + ADD_TRAIT(owner, TRAIT_WEB_WEAVER, REF(src)) + RegisterSignals(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED), PROC_REF(update_status_on_signal)) + +/datum/action/cooldown/mob_cooldown/lay_membrane/Remove(mob/removed_from) + . = ..() + REMOVE_TRAIT(removed_from, TRAIT_WEB_WEAVER, REF(src)) + UnregisterSignal(removed_from, list(COMSIG_MOVABLE_MOVED, COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED)) + +/datum/action/cooldown/mob_cooldown/lay_membrane/IsAvailable(feedback = FALSE) + . = ..() + if(!.) + return FALSE + if(DOING_INTERACTION(owner, DOAFTER_SOURCE_SPIDER)) + if (feedback) + owner.balloon_alert(owner, "busy!") + return FALSE + if(!isturf(owner.loc)) + if (feedback) + owner.balloon_alert(owner, "invalid location!") + return FALSE + if(HAS_TRAIT(owner.loc, TRAIT_SPINNING_WEB_TURF)) + if (feedback) + owner.balloon_alert(owner, "already being produced!") + return FALSE + if(obstructed_by_other_membrane()) + if (feedback) + owner.balloon_alert(owner, "already influenced!") + return FALSE + return TRUE + +/// Returns true if there's a membrane we can't put stuff on in our turf +/datum/action/cooldown/mob_cooldown/lay_membrane/proc/obstructed_by_other_membrane() + return !!(locate(/obj/structure/chosm/membrane) in get_turf(owner)) + +/datum/action/cooldown/mob_cooldown/lay_membrane/Activate() + . = ..() + var/turf/spider_turf = get_turf(owner) // Try to change spider_turf maybe? Oh god + var/obj/structure/chosm/membrane/membrane = locate() in spider_turf // Changed 'web' to 'membrane' here + if(membrane) + owner.balloon_alert_to_viewers("sealing web...") // Remove + else + owner.balloon_alert_to_viewers("spooling membrane...") + ADD_TRAIT(spider_turf, TRAIT_SPINNING_WEB_TURF, REF(src)) + if(do_after(owner, webbing_time, target = spider_turf, interaction_key = DOAFTER_SOURCE_SPIDER) && owner.loc == spider_turf) + plant_web(spider_turf, membrane) + else + owner?.balloon_alert(owner, "interrupted!") // Null check because we might have been interrupted via being disintegrated + REMOVE_TRAIT(spider_turf, TRAIT_SPINNING_WEB_TURF, REF(src)) + build_all_button_icons() + +/// Creates a web in the current turf +/datum/action/cooldown/mob_cooldown/lay_membrane/proc/plant_web(turf/target_turf, obj/structure/chosm/membrane/existing_web) // Change plant_web? // Change existing_web? + new /obj/structure/chosm/membrane(target_turf) + +// The actual membrane itself +/datum/action/cooldown/mob_cooldown/lay_membrane/sinuous_tissue + name = "Spool Sinuous Tissue" + desc = "Spool a thick membrane. Spread the Chosm's influence." + button_icon_state = "spider_ropes" // change + cooldown_time = 5 SECONDS + webbing_time = 3 SECONDS + +// Ranged hook attack for Scion, long cooldown. +/datum/action/cooldown/spell/pointed/projectile/chosmhook + name = "chosm hook" + desc = "Launch at your prey to pull them in closer." + button_icon = 'modular_nova/modules/spider/icons/abilities.dmi' + button_icon_state = "webhook" + background_icon_state = "bg_alien" + overlay_icon_state = "bg_alien_border" + + cooldown_time = 1 MINUTES + spell_requirements = NONE + + active_msg = "You prepare to launch a chosm hook at your target!" + cast_range = 8 + projectile_type = /obj/projectile/hook/chosm + +// chosm hook projectile, keeps every but subtypes the icons +/obj/projectile/hook/chosm + name = "chosmhook" + icon_state = "hook" // Okay so the way the original web-hook was made is upsettingly off-set. Im pretty sure I'd have to just align them properly to fix it, + // But god that would suck to go back and do. Also the code might just misalign it anyways. Fuck. + icon = 'modular_iris/modules/daemons/icons/chosm_abilities.dmi' + chain_icon = 'modular_iris/modules/daemons/icons/chosm_abilities.dmi' + projectile_phasing = PASSTABLE | PASSGRILLE | PASSSTRUCTURE // THIS IS VITAL TO ENSURE IT DOESN'T HIT THE MEMBRANE + + + +// Scion Ranged Projectile +/datum/action/cooldown/spell/pointed/projectile/chosm_spit + name = "volatile essence" + desc = "Launch at your prey to harm them." + button_icon = 'modular_iris/icons/mob/simple/chosm_projectiles.dmi' + button_icon_state = "volatile_essence" + background_icon_state = "bg_alien" + overlay_icon_state = "bg_alien_border" + + cooldown_time = 13 SECONDS + spell_requirements = NONE + + active_msg = "You prepare to spit volatile essence at your target!" + cast_range = 10 + projectile_type = /obj/projectile/volatile_essence + +// The Projectile for the Spit +/obj/projectile/volatile_essence + name = "volatile essence" + icon = 'modular_iris/icons/mob/simple/chosm_projectiles.dmi' + icon_state = "volatile_essence" + damage = 20 // This is maybe too high. Needs extensive testing because of the potentially high fire-rate. + // So this is basically to avoid hitting membrane before the person + projectile_phasing = PASSTABLE | PASSGRILLE | PASSSTRUCTURE + reflectable = FALSE + stutter = 8 SECONDS + stamina = 30 + +// Fool Charge ability +/datum/action/cooldown/mob_cooldown/charge/basic_charge/chosm_charge + name = "Chosmic Charge" + cooldown_time = 8 SECONDS + charge_delay = 0.3 SECONDS + charge_distance = 7 + melee_cooldown_time = 0 + /// Amount of time to stun self upon impact + recoil_duration = 0.3 SECONDS + /// Amount of time to knock over an impacted target + knockdown_duration = 1 SECONDS + + +/datum/action/cooldown/mob_cooldown/goliath_tentacles/chosm + cooldown_time = 20 SECONDS + max_range = 8 + + + +// FUCK WHY AM I TRYING TO ADD THIS!!! KILL ME!! +// Update: This all worked first try. Which is terrifying. Might be severely broken. +// Create Membrane Nexus. This will NOT be used by anything because it is supposed to just be admin-spawned. +/datum/action/cooldown/mob_cooldown/lay_membrane/create_nexus + name = "Create Nexus" + desc = "Create a Chosm Nexus. Begin the Devouring." + button_icon = 'modular_iris/modules/daemons/icons/chosm_nexus.dmi' + cooldown_time = 5 SECONDS + button_icon_state = "nexus" + +/datum/action/cooldown/mob_cooldown/lay_membrane/create_nexus/vacant + cooldown_time = 5 SECONDS + +/datum/action/cooldown/mob_cooldown/lay_membrane/create_nexus/plant_web(turf/target_turf, obj/structure/chosm/membrane/existing_web) + new /obj/structure/chosm/membrane/alive/chosm_nexus(target_turf) // TO BE VERY CLEAR THIS CODE IS SAYING WHAT THE NEXUS IS GOING TO CREATE. + +// base web structure subtype, we wanna keep the web functions but make it so they can spread +/obj/structure/chosm/membrane/alive + var/chosm_nexus_range = 10 // 10 Might be too much. We'll find out. + ///the parent node that will determine if we grow or die + var/obj/structure/chosm/membrane/alive/chosm_nexus/parent_node + ///the list of turfs that the weeds will not be able to grow over + var/static/list/blacklisted_turfs = list( + /turf/open/space, + /turf/open/chasm, + /turf/open/lava, + /turf/open/water, + /turf/open/openspace, + ) + +/obj/structure/chosm/membrane/alive/Initialize(mapload) + . = ..() + +/obj/structure/chosm/membrane/alive/Destroy() + if(parent_node) + UnregisterSignal(parent_node, COMSIG_QDELETING) + parent_node = null + return ..() + +/** + * Called when the chosm_nexus is trying to grow/expand + */ +/obj/structure/chosm/membrane/alive/proc/try_expand() + //we cant grow without a parent spider_effigy + if(!parent_node) + return + //lets make sure we are still on a valid location + var/turf/src_turf = get_turf(src) + if(is_type_in_list(src_turf, blacklisted_turfs)) + qdel(src) + return + //lets try to grow in a direction + for(var/turf/check_turf in src_turf.get_atmos_adjacent_turfs()) + //we cannot grow on blacklisted turfs + if(is_type_in_list(check_turf, blacklisted_turfs)) + continue + var/obj/structure/chosm/membrane/alive/check_membrane = locate() in check_turf + //we cannot grow onto other webs + if(check_membrane) + continue + //spawn a new one in the turf + check_membrane = new(check_turf) + //set the new one's parent spider_effigy to our parent spider_effigy + check_membrane.parent_node = parent_node + +// This is the actual Nexus Object code. All of the above shit is growth/membrane code. +/obj/structure/chosm/membrane/alive/chosm_nexus + name = "Unsettling plinth" + desc = "A cylindrical plinth surrounded by sinuous membrane. Staring at it too long gives you a dizzying headache - As though it's tearing reality around it apart." + icon = 'modular_iris/modules/daemons/icons/chosm_nexus.dmi' + icon_state = "nexus" + base_icon_state = "nexus" + smoothing_flags = NONE + smoothing_groups = NONE + canSmoothWith = NONE + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + density = TRUE + light_range = 3 + light_color = COLOR_AMETHYST + light_power = 0.5 + max_integrity = 900 // This survives 10+ Laser Carbine shots. Honestly not alot. + anchored = TRUE + plane = -1 + flags_ricochet = RICOCHET_SHINY | RICOCHET_HARD // Reflector code + receive_ricochet_chance_mod = INFINITY + var/mob_types = list(/mob/living/basic/daemons/chosm_entities/vacant/drudge, /mob/living/basic/daemons/chosm_entities/vacant/scion, /mob/living/basic/daemons/chosm_entities/vacant/fool) + var/obj/effect/abstract/particle_holder/spooky_particles + ///the minimum time it takes for another weed to spread from this one + var/minimum_growtime = 8 SECONDS + ///the maximum time it takes for another weed to spread from this one + var/maximum_growtime = 18 SECONDS + //the cooldown between each growth + COOLDOWN_DECLARE(growtime) + +// Assign the boi as the parent +/obj/structure/chosm/membrane/alive/chosm_nexus/Initialize(mapload) + . = ..() + //we are the parent chosm_nexus + parent_node = src + pixel_x = 0 + pixel_y = 0 + add_filter("Nexus", 2, list("type" = "outline", "color" = "#c72424ff", "size" = 0.12)) + var/filter = get_filter("Nexus") + animate(filter, alpha = 230, time = 2 SECONDS, loop = -1) + animate(alpha = 30, time = 0.5 SECONDS) + // Spawner bullshit + AddComponent(/datum/component/spawner, \ + spawn_types = mob_types, \ + spawn_time = 60 SECONDS, \ + max_spawned = 5, \ + faction = list(FACTION_NETHER) , \ + spawn_text = "emerges from", \ + spawn_callback = CALLBACK(src, PROC_REF(on_mob_spawn)), \ + ) + return INITIALIZE_HINT_LATELOAD + +/obj/structure/chosm/membrane/alive/chosm_nexus/proc/on_mob_spawn(atom/created_atom) + return + +/obj/structure/chosm/membrane/alive/chosm_nexus/on_mob_spawn(atom/created_atom) + created_atom.AddComponent(\ + /datum/component/ghost_direct_control,\ + role_name = "A Chosm Entity",\ + assumed_control_message = null,\ + after_assumed_control = CALLBACK(src, PROC_REF(became_player_controlled)),\ + playsound(src.loc, 'modular_iris/sound/daemons/nexus_emergence.ogg', 50, TRUE), \ + ) + +/obj/structure/chosm/membrane/alive/chosm_nexus/proc/became_player_controlled(mob/proteon) + return + + +// we do this in LateInitialize() because membrane on the same loc may not be done initializing yet (as in create_and_destroy) +/obj/structure/chosm/membrane/alive/chosm_nexus/LateInitialize() + //destroy any non-chosm_nexus membranes on turf + var/obj/structure/chosm/membrane/alive/check_membrane = locate(/obj/structure/chosm/membrane/alive) in loc + if(check_membrane && check_membrane != src) + qdel(check_membrane) + + //start the cooldown + COOLDOWN_START(src, growtime, rand(minimum_growtime, maximum_growtime)) + + //start processing + START_PROCESSING(SSobj, src) + +/obj/structure/chosm/membrane/alive/chosm_nexus/process() + //we need to have a cooldown, so check and then add + if(!COOLDOWN_FINISHED(src, growtime)) + return + COOLDOWN_START(src, growtime, rand(minimum_growtime, maximum_growtime)) + //attempt to grow all webs in range + for(var/obj/structure/chosm/membrane/alive/growing_membrane in range(chosm_nexus_range, src)) + growing_membrane.try_expand() + + + + +/datum/action/cooldown/mob_cooldown/lay_membrane/create_cyst + name = "Create Cyst" + desc = "Create a Chosm Cyst. Spread the Devouring." + button_icon = 'modular_iris/modules/daemons/icons/chosm_nexus.dmi' + cooldown_time = 3 MINUTES + button_icon_state = "cyst" + +/datum/action/cooldown/mob_cooldown/lay_membrane/create_cyst/vacant // This can be removed I think. Looks pointless. + cooldown_time = 3 MINUTES + +/datum/action/cooldown/mob_cooldown/lay_membrane/create_cyst/plant_web(turf/target_turf, obj/structure/chosm/membrane/existing_web) + new /obj/structure/chosm/membrane/alive/chosm_nexus/chosm_cyst(target_turf) // TO BE VERY CLEAR THIS CODE IS SAYING WHAT THE NEXUS IS GOING TO CREATE. + + +// This is the actual Nexus Object code. All of the above shit is growth/membrane code. +/obj/structure/chosm/membrane/alive/chosm_nexus/chosm_cyst + name = "Unsettling cyst" + desc = "A cylindrical plinth surrounded by sinuous membrane. Staring at it too long gives you a dizzying headache - As though it's tearing reality around it apart." + icon = 'modular_iris/modules/daemons/icons/chosm_nexus.dmi' + icon_state = "cyst" + base_icon_state = "cyst" + smoothing_flags = NONE + smoothing_groups = NONE + canSmoothWith = NONE + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + density = TRUE + light_range = 3 + light_color = COLOR_AMETHYST + light_power = 0.5 + max_integrity = 300 // Much weaker than the Nexus for obvious reasons + anchored = TRUE + plane = -1 + flags_ricochet = RICOCHET_SHINY | RICOCHET_HARD // Reflector code + receive_ricochet_chance_mod = INFINITY + mob_types = null + ///the minimum time it takes for another weed to spread from this one + minimum_growtime = 20 SECONDS + ///the maximum time it takes for another weed to spread from this one + maximum_growtime = 30 SECONDS + //the cooldown between each growth + + +/obj/structure/chosm/membrane/alive/chosm_nexus/Destroy() + playsound(src.loc, 'modular_iris/sound/daemons/cyst_death.ogg', 50, TRUE) + return ..() diff --git a/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/chosm_ai_subtrees.dm b/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/chosm_ai_subtrees.dm new file mode 100644 index 000000000000..e316761595f2 --- /dev/null +++ b/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/chosm_ai_subtrees.dm @@ -0,0 +1,85 @@ +/// Search for a nearby location to put webs on +/datum/ai_planning_subtree/find_unwebbed_turf + +/datum/ai_planning_subtree/find_unwebbed_turf/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + controller.queue_behavior(/datum/ai_behavior/find_unwebbed_turf) + +/// Find an unwebbed nearby turf and store it +/datum/ai_behavior/find_unwebbed_turf + action_cooldown = 5 SECONDS + /// Where do we store the target data + /// How far do we look for unwebbed turfs? + +/datum/ai_behavior/find_unwebbed_turf/perform(seconds_per_tick, datum/ai_controller/controller) + var/mob/living/spider = controller.pawn + var/atom/current_target = controller.blackboard[target_key] + if (current_target && !(locate(/obj/structure/chosm/membrane) in current_target)) + // Already got a target + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + + controller.clear_blackboard_key(target_key) + var/turf/our_turf = get_turf(spider) + if (is_valid_membrane_turf(our_turf, spider)) + controller.set_blackboard_key(target_key, our_turf) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED + + var/list/turfs_by_range = list() + for (var/i in 1 to scan_range) + turfs_by_range["[i]"] = list() + for (var/turf/turf_in_view in oview(scan_range, our_turf)) + if (!is_valid_membrane_turf(turf_in_view, spider)) + continue + turfs_by_range["[get_dist(our_turf, turf_in_view)]"] += turf_in_view + + var/list/final_turfs + for (var/list/turf_list as anything in turfs_by_range) + if (length(turfs_by_range[turf_list])) + final_turfs = turfs_by_range[turf_list] + break + if (!length(final_turfs)) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + + controller.set_blackboard_key(target_key, pick(final_turfs)) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED + +/datum/ai_behavior/find_unwebbed_turf/proc/is_valid_membrane_turf(turf/target_turf, mob/living/spider) + if (locate(/obj/structure/chosm/membrane) in target_turf) + return FALSE + if (HAS_TRAIT(target_turf, TRAIT_SPINNING_WEB_TURF)) + return FALSE + return !target_turf.is_blocked_turf(source_atom = spider) + +/// Run the spin web behaviour if we have an ability to use for it +/datum/ai_planning_subtree/spin_web + /// Key where the web spinning action is stored + /// Key where the target turf is stored + +/datum/ai_planning_subtree/spin_web/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if (controller.blackboard_key_exists(action_key) && controller.blackboard_key_exists(target_key)) + controller.queue_behavior(/datum/ai_behavior/spin_web, action_key, target_key) + return SUBTREE_RETURN_FINISH_PLANNING + +/// Move to an unwebbed nearby turf and web it up +/datum/ai_behavior/spin_web + action_cooldown = 15 SECONDS // We don't want them doing this too quickly + required_distance = 0 + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/spin_web/setup(datum/ai_controller/controller, action_key, target_key) + var/datum/action/cooldown/web_action = controller.blackboard[action_key] + var/turf/target_turf = controller.blackboard[target_key] + if (!web_action || !target_turf) + return FALSE + + set_movement_target(controller, target_turf) + return ..() + +/datum/ai_behavior/spin_web/perform(seconds_per_tick, datum/ai_controller/controller, action_key, target_key) + var/datum/action/cooldown/web_action = controller.blackboard[action_key] + if(web_action?.Trigger()) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + +/datum/ai_behavior/spin_web/finish_action(datum/ai_controller/controller, succeeded, action_key, target_key) + controller.clear_blackboard_key(target_key) + return ..() diff --git a/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/chosm_entities.dm b/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/chosm_entities.dm new file mode 100644 index 000000000000..1c38e497f636 --- /dev/null +++ b/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/chosm_entities.dm @@ -0,0 +1,158 @@ +//KNOWN ISSUES/BUGS + +// ISSUE-1: When the creatures die and then are revived (Should not happen naturally), their offset is reset (pixel_x and pixel_y). This makes them much harder to control +// But this shouldn't be an issue since revivals should NOT be happening. +// ISSUE-2: For all of the icons for the buttons we use shit from Nova. I'll be honest, this is some real bad Tech-Debt. In the event of Nova fucking around with those, +// This entire file alongside abilities will just shit the bed and die. Definitely in the future need to add custom icons for the buttons. + + + + + +/mob/living/basic/daemons/chosm_entities/vacant + name = "vacant" + desc = "YOU SHOULDN'T BE SEEING THIS. YOU SHOULDN'T BE SEEING THIS. YOU SHOULDN'T BE SEEING THIS." + icon = 'modular_iris/icons/mob/simple/chosms.dmi' + icon_state = "vacant" + icon_living = "vacant" + icon_dead = "vacant_dead" + speed = 0.6 + maxHealth = 200 + health = 200 + obj_damage = 40 + pixel_x = -40 + pixel_y = -20 + melee_damage_lower = 20 + melee_damage_upper = 25 + ai_controller = /datum/ai_controller/basic_controller/chosm_basic + max_grab = GRAB_AGGRESSIVE + faction = list(FACTION_NETHER) + melee_attack_cooldown = CLICK_CD_MELEE + response_help_continuous = "pets" + response_help_simple = "pet" + speak_emote = list("echoes") + initial_language_holder = /datum/language_holder/shadowpeople + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0) + attack_verb_continuous = "strikes" + attack_verb_simple = "strike" + attack_sound = 'modular_iris/sound/items/weapons/distort_strike.ogg' + unsuitable_cold_damage = 0 + unsuitable_heat_damage = 0 + attack_vis_effect = ATTACK_EFFECT_VOID + unique_name = TRUE + max_stamina = 500 + stamina_crit_threshold = BASIC_MOB_NO_STAMCRIT + stamina_recovery = 5 + max_stamina_slowdown = 12 + /// Actions to grant on Initialize + var/list/innate_actions = null + var/web_speed = 1 + var/web_type = /datum/action/cooldown/mob_cooldown/lay_membrane + + +/mob/living/basic/daemons/chosm_entities/vacant/Initialize(mapload) + . = ..() + add_traits(list(TRAIT_WEB_SURFER, TRAIT_FENCE_CLIMBER, TRAIT_TENTACLE_IMMUNE), INNATE_TRAIT) // This is required due to how I've implemented Membranes. Anyone with the Web Surfer trait can just walk over them. + grant_actions_by_list(innate_actions) + transform = transform.Scale(0.8, 0.8) + // Actually adding the lay_membrane ability to all children of this mob type. This is extremely useful because of how modifiable it is. + var/datum/action/cooldown/mob_cooldown/lay_membrane/sinuous_tissue/webbing = new web_type(src) + webbing.webbing_time *= web_speed + webbing.Grant(src) + ai_controller?.set_blackboard_key(BB_SPIDER_WEB_ACTION, webbing) + var/static/list/other_innate_actions = list( + /datum/action/adjust_vision/bileworm = null, + ) + grant_actions_by_list(other_innate_actions) + update_appearance(UPDATE_OVERLAYS) + AddComponent(/datum/component/seethrough_mob) + +// Grunt, should have middling stats overall. +/mob/living/basic/daemons/chosm_entities/vacant/drudge + name = "drudge" + desc = "A conjoined mass, this one twitches rythmically." + icon = 'modular_iris/icons/mob/simple/chosms.dmi' + icon_state = "drudge" + icon_living = "drudge" + icon_dead = "drudge_dead" + gender = MALE + maxHealth = 225 + health = 225 + melee_damage_lower = 20 + melee_damage_upper = 25 + obj_damage = 35 + speed = 0.8 + innate_actions = list( + /datum/action/cooldown/spell/pointed/projectile/chosm_spit + ) + +/mob/living/basic/daemons/chosm_entities/vacant/drudge/Initialize(mapload) + . = ..() + add_traits(list(TRAIT_THERMAL_VISION), INNATE_TRAIT) + AddElement(/datum/element/web_walker) + transform = transform.Scale(0.8, 0.8) + + + +// Glass-Cannon charger. High damage, low health. High speed. +/mob/living/basic/daemons/chosm_entities/vacant/fool + name = "fool" + desc = "A hulking mass of absent, black void. This one has six swirling eyes and an incandescent core. It glides on six tiny legs." + icon = 'modular_iris/icons/mob/simple/chosms.dmi' + icon_state = "fool" + icon_living = "fool" + icon_dead = "fool_dead" + gender = MALE + maxHealth = 125 + health = 125 + pixel_y = -10 + melee_damage_lower = 40 + melee_damage_upper = 45 + obj_damage = 40 + speed = 0.4 + var/datum/action/cooldown/mob_cooldown/goliath_tentacles/chosm/tentacles + innate_actions = list( + /datum/action/cooldown/mob_cooldown/charge/basic_charge/chosm_charge,) // While I would like to add more pizazz to this maybe in the future, for now this is fine as just a basic charge. + +/mob/living/basic/daemons/chosm_entities/vacant/fool/Initialize(mapload) + . = ..() + AddElement(/datum/element/web_walker) + transform = transform.Scale(0.9, 0.9) + tentacles = new (src) + tentacles.Grant(src) + + + +// Nexus tender, Ranged Unit with good wound ability. Low damage with middling health. +/mob/living/basic/daemons/chosm_entities/vacant/scion + name = "scion" + desc = "A many limbed bulbous mass of absent, black void. This one is brimming with malfeasant iridescent energy and several gland-like projectors." + icon = 'modular_iris/icons/mob/simple/chosms.dmi' + icon_state = "scion" + icon_living = "scion" + icon_dead = "scion_dead" + gender = FEMALE + maxHealth = 90 + health = 90 + melee_damage_lower = 15 + melee_damage_upper = 20 + wound_bonus = 25 + exposed_wound_bonus = 50 + web_speed = 0.25 + sharpness = SHARP_EDGED + sight = SEE_TURFS // Has Meson vision, basically. + obj_damage = 60 // Highest Object damage because they need to clear room for the Nexus. + speed = 1 // Pretty bad speed stat, they shouldn't be moving away from the Nexus anyways. + innate_actions = list( + /datum/action/cooldown/spell/pointed/projectile/chosmhook, + /datum/action/cooldown/mob_cooldown/lay_membrane/create_cyst, + + + + ) + +/mob/living/basic/daemons/chosm_entities/vacant/scion/Initialize(mapload) + . = ..() + AddElement(/datum/element/wall_tearer) // To spread the Nexus. + AddElement(/datum/element/web_walker) + transform = transform.Scale(0.8, 0.8) diff --git a/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/chosm_entities_ai.dm b/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/chosm_entities_ai.dm new file mode 100644 index 000000000000..fcc6a2103b3c --- /dev/null +++ b/modular_iris/code/modules/mob/living/basic/space_fauna/daemons/chosm_entities_ai.dm @@ -0,0 +1,17 @@ +/datum/ai_controller/basic_controller/chosm_basic + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking + + planning_subtrees = list( + /datum/ai_planning_subtree/escape_captivity, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/random_speech/insect, // Space spiders are taxonomically insects not arachnids, don't DM me + /datum/ai_planning_subtree/find_unwebbed_turf, + /datum/ai_planning_subtree/spin_web, + ) diff --git a/modular_iris/icons/effects/chosm_parallax.dmi b/modular_iris/icons/effects/chosm_parallax.dmi new file mode 100644 index 000000000000..aea7f9e6b837 Binary files /dev/null and b/modular_iris/icons/effects/chosm_parallax.dmi differ diff --git a/modular_iris/icons/mob/simple/angel.dmi b/modular_iris/icons/mob/simple/angel.dmi new file mode 100644 index 000000000000..d42e791d1444 Binary files /dev/null and b/modular_iris/icons/mob/simple/angel.dmi differ diff --git a/modular_iris/icons/mob/simple/angel_projectiles.dmi b/modular_iris/icons/mob/simple/angel_projectiles.dmi new file mode 100644 index 000000000000..0b86f65e3a4a Binary files /dev/null and b/modular_iris/icons/mob/simple/angel_projectiles.dmi differ diff --git a/modular_iris/icons/mob/simple/chosm_projectiles.dmi b/modular_iris/icons/mob/simple/chosm_projectiles.dmi new file mode 100644 index 000000000000..73d99a8a4a8f Binary files /dev/null and b/modular_iris/icons/mob/simple/chosm_projectiles.dmi differ diff --git a/modular_iris/icons/mob/simple/chosms.dmi b/modular_iris/icons/mob/simple/chosms.dmi new file mode 100644 index 000000000000..c6c719d3d5c3 Binary files /dev/null and b/modular_iris/icons/mob/simple/chosms.dmi differ diff --git a/modular_iris/icons/obj/smooth_structures/sinuous_tissue.dmi b/modular_iris/icons/obj/smooth_structures/sinuous_tissue.dmi new file mode 100644 index 000000000000..fa73dd759145 Binary files /dev/null and b/modular_iris/icons/obj/smooth_structures/sinuous_tissue.dmi differ diff --git a/modular_iris/modules/daemons/icons/chosm_abilities.dmi b/modular_iris/modules/daemons/icons/chosm_abilities.dmi new file mode 100644 index 000000000000..0950c82aa8d0 Binary files /dev/null and b/modular_iris/modules/daemons/icons/chosm_abilities.dmi differ diff --git a/modular_iris/modules/daemons/icons/chosm_nexus.dmi b/modular_iris/modules/daemons/icons/chosm_nexus.dmi new file mode 100644 index 000000000000..e49efecc0856 Binary files /dev/null and b/modular_iris/modules/daemons/icons/chosm_nexus.dmi differ diff --git a/modular_iris/sound/daemons/angel_deep_strike.ogg b/modular_iris/sound/daemons/angel_deep_strike.ogg new file mode 100644 index 000000000000..bf7582f7d88a Binary files /dev/null and b/modular_iris/sound/daemons/angel_deep_strike.ogg differ diff --git a/modular_iris/sound/daemons/angel_revival.ogg b/modular_iris/sound/daemons/angel_revival.ogg new file mode 100644 index 000000000000..faa1f51ed17e Binary files /dev/null and b/modular_iris/sound/daemons/angel_revival.ogg differ diff --git a/modular_iris/sound/daemons/angel_strike.ogg b/modular_iris/sound/daemons/angel_strike.ogg new file mode 100644 index 000000000000..82dc34587d91 Binary files /dev/null and b/modular_iris/sound/daemons/angel_strike.ogg differ diff --git a/modular_iris/sound/daemons/angel_wrath.ogg b/modular_iris/sound/daemons/angel_wrath.ogg new file mode 100644 index 000000000000..ae6d342ec846 Binary files /dev/null and b/modular_iris/sound/daemons/angel_wrath.ogg differ diff --git a/modular_iris/sound/daemons/cinematics/angel_laser.ogg b/modular_iris/sound/daemons/cinematics/angel_laser.ogg new file mode 100644 index 000000000000..eb052e29b261 Binary files /dev/null and b/modular_iris/sound/daemons/cinematics/angel_laser.ogg differ diff --git a/modular_iris/sound/daemons/cinematics/chosm_atmosphere.ogg b/modular_iris/sound/daemons/cinematics/chosm_atmosphere.ogg new file mode 100644 index 000000000000..548c835d9fe9 Binary files /dev/null and b/modular_iris/sound/daemons/cinematics/chosm_atmosphere.ogg differ diff --git a/modular_iris/sound/daemons/cinematics/chosm_rumbling.ogg b/modular_iris/sound/daemons/cinematics/chosm_rumbling.ogg new file mode 100644 index 000000000000..c2f5173c08bc Binary files /dev/null and b/modular_iris/sound/daemons/cinematics/chosm_rumbling.ogg differ diff --git a/modular_iris/sound/daemons/cinematics/chosm_summon_rumble.ogg b/modular_iris/sound/daemons/cinematics/chosm_summon_rumble.ogg new file mode 100644 index 000000000000..0504bec8e604 Binary files /dev/null and b/modular_iris/sound/daemons/cinematics/chosm_summon_rumble.ogg differ diff --git a/modular_iris/sound/daemons/cinematics/chosmwin.ogg b/modular_iris/sound/daemons/cinematics/chosmwin.ogg new file mode 100644 index 000000000000..c09549c4f3d3 Binary files /dev/null and b/modular_iris/sound/daemons/cinematics/chosmwin.ogg differ diff --git a/modular_iris/sound/daemons/cinematics/emissary_arrival.ogg b/modular_iris/sound/daemons/cinematics/emissary_arrival.ogg new file mode 100644 index 000000000000..d63db23e0213 Binary files /dev/null and b/modular_iris/sound/daemons/cinematics/emissary_arrival.ogg differ diff --git a/modular_iris/sound/daemons/cinematics/something_is_terribly_wrong.ogg b/modular_iris/sound/daemons/cinematics/something_is_terribly_wrong.ogg new file mode 100644 index 000000000000..91ca931cc1b7 Binary files /dev/null and b/modular_iris/sound/daemons/cinematics/something_is_terribly_wrong.ogg differ diff --git a/modular_iris/sound/daemons/cyst_death.ogg b/modular_iris/sound/daemons/cyst_death.ogg new file mode 100644 index 000000000000..36a6b2724ae8 Binary files /dev/null and b/modular_iris/sound/daemons/cyst_death.ogg differ diff --git a/modular_iris/sound/daemons/emissary_bell_2.ogg b/modular_iris/sound/daemons/emissary_bell_2.ogg new file mode 100644 index 000000000000..8447cffcda58 Binary files /dev/null and b/modular_iris/sound/daemons/emissary_bell_2.ogg differ diff --git a/modular_iris/sound/daemons/membrane_death.ogg b/modular_iris/sound/daemons/membrane_death.ogg new file mode 100644 index 000000000000..c0f4a100df0c Binary files /dev/null and b/modular_iris/sound/daemons/membrane_death.ogg differ diff --git a/modular_iris/sound/daemons/nexus_emergence.ogg b/modular_iris/sound/daemons/nexus_emergence.ogg new file mode 100644 index 000000000000..eb85601c83f5 Binary files /dev/null and b/modular_iris/sound/daemons/nexus_emergence.ogg differ diff --git a/modular_iris/sound/items/weapons/distort_strike.ogg b/modular_iris/sound/items/weapons/distort_strike.ogg new file mode 100644 index 000000000000..7c4025d849b6 Binary files /dev/null and b/modular_iris/sound/items/weapons/distort_strike.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 10e2e0af02ec..bd07e6e798c3 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6912,11 +6912,13 @@ #include "modular_iris\code\__DEFINES\send2relay.dm" #include "modular_iris\code\_onclick\hud\ghost.dm" #include "modular_iris\code\datums\ruins.dm" +#include "modular_iris\code\datums\cinematics\_cinematic_iris.dm" #include "modular_iris\code\datums\components\crafting\furniture.dm" #include "modular_iris\code\datums\mood_events\drug_events.dm" #include "modular_iris\code\datums\shuttles\pirate.dm" #include "modular_iris\code\game\area\areas\centcom.dm" #include "modular_iris\code\game\objects\effects\landmarks.dm" +#include "modular_iris\code\game\objects\effects\membrane_structures.dm" #include "modular_iris\code\game\objects\items\pinpointer.dm" #include "modular_iris\code\game\objects\items\circuitboards\machine_circuitboards.dm" #include "modular_iris\code\game\objects\items\devices\radio.dm" @@ -6924,6 +6926,12 @@ #include "modular_iris\code\game\objects\items\storage\boxes.dm" #include "modular_iris\code\game\objects\items\storage\garment.dm" #include "modular_iris\code\modules\clothing\suits\labcoat.dm" +#include "modular_iris\code\modules\mob\living\basic\space_fauna\daemons\angel.dm" +#include "modular_iris\code\modules\mob\living\basic\space_fauna\daemons\angel_abilities.dm" +#include "modular_iris\code\modules\mob\living\basic\space_fauna\daemons\chosm_abilities.dm" +#include "modular_iris\code\modules\mob\living\basic\space_fauna\daemons\chosm_ai_subtrees.dm" +#include "modular_iris\code\modules\mob\living\basic\space_fauna\daemons\chosm_entities.dm" +#include "modular_iris\code\modules\mob\living\basic\space_fauna\daemons\chosm_entities_ai.dm" #include "modular_iris\doppler_ports\autotransfer\shuttle.dm" #include "modular_iris\doppler_ports\species\holosynth\code\holopassthrough.dm" #include "modular_iris\doppler_ports\species\holosynth\code\holosynth.dm"