diff --git a/code/__defines/_fruits.dm b/code/__defines/_fruits.dm index 2d541dc156..3d3c59a13d 100644 --- a/code/__defines/_fruits.dm +++ b/code/__defines/_fruits.dm @@ -92,6 +92,9 @@ #define PLANT_WURMWOAD "wurmwoad" #define PLANT_MICROM "microm" #define PLANT_MEGAM "megam" +#define PLANT_TEA "tea" +#define PLANT_PITCHERPLANT "pitcher plant" +#define PLANT_NULLHARDLIGHT "Type NULL Hardlight Generator" // CHompAdd Start #define PLANT_VOLTATO "voltato" @@ -104,9 +107,6 @@ #define PLANT_BLUESAPBEAN "bluesapbean" #define PLANT_BLACKSAPBEAN "blacksapbean" #define PLANT_MEATWHEAT "meatwheat" -#define PLANT_TEA "tea" -#define PLANT_PITCHERPLANT "pitcher plant" -#define PLANT_NULLHARDLIGHT "Type NULL Hardlight Generator" #define PLANT_CINNAMON "cinnamon" #define PLANT_GARDENIA "gardenia" #define PLANT_CHERRYBOMB "cherrybomb" diff --git a/code/__defines/_reagents.dm b/code/__defines/_reagents.dm index 985cb1d447..837fc895fb 100644 --- a/code/__defines/_reagents.dm +++ b/code/__defines/_reagents.dm @@ -27,6 +27,8 @@ #define REAGENT_ID_FLUORINE "fluorine" #define REAGENT_CHLORINE "Chlorine" #define REAGENT_ID_CHLORINE "chlorine" +#define REAGENT_MIASMA "Miasma" +#define REAGENT_ID_MIASMA "miasma" // Fluid Reagents @@ -147,6 +149,8 @@ #define REAGENT_ID_PAROXETINE "paroxetine" #define REAGENT_QERRQUEM "Qerr-quem" #define REAGENT_ID_QERRQUEM "qerr_quem" +#define REAGENT_APHRODISIAC "Aphrodisiac" +#define REAGENT_ID_APHRODISIAC "aphrodisiac" // Modifiers @@ -433,6 +437,8 @@ #define REAGENT_ID_LIQUIDCARPETO "liquidcarpeto" #define REAGENT_ESSENTIALOIL "Essential Oils" #define REAGENT_ID_ESSENTIALOIL "essential_oil" +#define REAGENT_PITCHERNECTAR "Pitcher Nectar" +#define REAGENT_ID_PITCHERNECTAR "pitcher_nectar" // Admin chems @@ -1033,6 +1039,8 @@ #define REAGENT_ID_CHAMPAGNE "champagne" #define REAGENT_CIDER "Cider" #define REAGENT_ID_CIDER "cider" +#define REAGENT_TEAMUSH "Tea mush" +#define REAGENT_ID_TEAMUSH "teamush" // Cocktails #define REAGENT_ACIDSPIT "Acid Spit" @@ -1369,6 +1377,11 @@ #define REAGENT_ID_METAMORPHIC "metamorphic" #define REAGENT_BINDING "Binding Metal" #define REAGENT_ID_BINDING "binding" +#define REAGENT_NUMBING_FLUID "Numbing Fluid" +#define REAGENT_ID_NUMBING_FLUID "succubi_numbing" +#define REAGENT_PARALYZE_FLUID "Paralyzing Fluid" +#define REAGENT_ID_PARALYZE_FLUID "succubi_paralize" +#define REAGENT_ID_APHRODIAC_FLUID "succubi_aphrodisiac" // Xenoslimes diff --git a/code/__defines/_reagents_ch.dm b/code/__defines/_reagents_ch.dm index 0a370625be..e779dbf020 100644 --- a/code/__defines/_reagents_ch.dm +++ b/code/__defines/_reagents_ch.dm @@ -1,7 +1,3 @@ -// Gas -#define REAGENT_MIASMA "Miasma" -#define REAGENT_ID_MIASMA "miasma" - // Drugs #define REAGENT_CLEANSINGAGENT "Cleansing Agent" #define REAGENT_ID_CLEANSINGAGENT "cleansingagent" @@ -33,8 +29,6 @@ #define REAGENT_ID_PHOENIXBREATH "phoenixbreath" #define REAGENT_DRYAGENT "Dry Agent" #define REAGENT_ID_DRYAGENT "dryagent" -#define REAGENT_APHRODISIAC "Aphrodisiac" -#define REAGENT_ID_APHRODISIAC "aphrodisiac" #define REAGENT_SORBITOL "Sorbitol" #define REAGENT_ID_SORBITOL "sorbitol" #define REAGENT_CLARIDYL "Claridyl Natural Remedy" @@ -97,8 +91,6 @@ #define REAGENT_ID_FRESHTEA "freshtea" #define REAGENT_FRESHGREENTEA "Refreshing green tea" #define REAGENT_ID_FRESHTEAGREEN "freshteagreen" -#define REAGENT_TEAMUSH "Tea mush" -#define REAGENT_ID_TEAMUSH "teamush" #define REAGENT_INSTANTTEAPOWDERGREEN "Instant green tea powder" #define REAGENT_ID_INSTANTTEAPOWDERGREEN "instantteapowdergreen" #define REAGENT_INSTANTTEAGREEN "Instant green tea" @@ -177,8 +169,6 @@ #define REAGENT_ID_ALUMINUMNITRATE "aluminum_nitrate" #define REAGENT_SPIDEREGG "spider eggs" #define REAGENT_ID_SPIDEREGG "spideregg" -#define REAGENT_PITCHERNECTAR "Pitcher Nectar" -#define REAGENT_ID_PITCHERNECTAR "pitcher_nectar" #define REAGENT_BENZILATE "Odd Goo" #define REAGENT_ID_BENZILATE "benzilate" #define REAGENT_PHENETHYLAMINE "Phenethylamine" @@ -271,9 +261,3 @@ #define REAGENT_ID_NEOLIQUIDFIRE "neoliquidfire" #define REAGENT_LIQUIDLIFE "Liquid Life" #define REAGENT_ID_LIQUIDLIFE "liquidlife" - -#define REAGENT_NUMBING_FLUID "Numbing Fluid" -#define REAGENT_ID_NUMBING_FLUID "succubi_numbing" -#define REAGENT_PARALYZE_FLUID "Paralyzing Fluid" -#define REAGENT_ID_PARALYZE_FLUID "succubi_paralize" -#define REAGENT_ID_APHRODIAC_FLUID "succubi_aphrodisiac" diff --git a/code/__defines/faction.dm b/code/__defines/faction.dm index d5407d755f..9348fa315f 100644 --- a/code/__defines/faction.dm +++ b/code/__defines/faction.dm @@ -20,9 +20,7 @@ #define FACTION_VIRGO3B "virgo3b" #define FACTION_ALTEVIAN "altevian" -#define FACTION_BLACKHOLE "blackhole" //CHOMPAdd #define FACTION_CULT "cult" -#define FACTION_ECLIPSE "eclipse" //CHOMPAdd #define FACTION_GLAMOUR "glamour" #define FACTION_PIRATE "pirate" #define FACTION_SHADEKIN "shadekin" @@ -108,8 +106,6 @@ #define FACTION_SUCCUBUS "succubus" #define FACTION_SWARMER "swarmer" #define FACTION_TEPPI "teppi" -#define FACTION_TYR "tyr" //CHOMPAdd -#define FACTION_TYR_ANT "tyr_ants" //CHOMPAdd #define FACTION_TUNNELCLOWN "tunnelclown" #define FACTION_TURKEY "turkey" #define FACTION_WILD_ANIMAL "wild animal" @@ -118,12 +114,16 @@ #define FACTION_WORM "worm" #define FACTION_XENO "xeno" #define FACTION_CORGI "corgi" -#define FACTION_ZORGOIA "zorgoia" // CHOMPAdd +#define FACTION_ZORGOIA "zorgoia" #define FACTION_PLANTS "plants" #define FACTION_MATH "MATH" //CHOMPAdd Start factions +#define FACTION_TYR "tyr" //CHOMPAdd +#define FACTION_TYR_ANT "tyr_ants" //CHOMPAdd #define FACTION_AWAYMISSION "awaymission" +#define FACTION_BLACKHOLE "blackhole" //CHOMPAdd +#define FACTION_ECLIPSE "eclipse" //CHOMPAdd //CHOMPAdd End diff --git a/code/datums/components/crafting/recipes/weapons.dm b/code/datums/components/crafting/recipes/weapons.dm index 84ba37b69b..fbdd5a0622 100644 --- a/code/datums/components/crafting/recipes/weapons.dm +++ b/code/datums/components/crafting/recipes/weapons.dm @@ -65,3 +65,16 @@ time = 180 category = CAT_WEAPONRY subcategory = CAT_WEAPON + +/datum/crafting_recipe/ziplaser + name = "Ziplaser" + result = /obj/item/gun/energy/zip/craftable + reqs = list(list(/obj/item/cell/high = 1), + list(/obj/item/stack/rods = 2), + list(/obj/item/stack/material/steel = 8), + list(/obj/item/stack/material/plastic = 5), + list(/obj/item/cell/device = 2) + ) + time = 120 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON diff --git a/code/datums/elements/lootable/mecha.dm b/code/datums/elements/lootable/mecha.dm index 781d59ac7f..92cd419256 100644 --- a/code/datums/elements/lootable/mecha.dm +++ b/code/datums/elements/lootable/mecha.dm @@ -243,3 +243,57 @@ /obj/item/mecha_parts/mecha_equipment/repair_droid, /obj/item/mecha_parts/mecha_equipment/teleporter ) + +// Stuff you may find attached to a mouse tank. +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/datum/element/lootable/mecha/mouse_tank + loot_left= 5 + + common_loot = list( + /obj/random/tool, + /obj/random/tool, + /obj/item/stack/cable_coil/random, + /obj/random/tank, + /obj/random/tech_supply/component, + /obj/random/tech_supply/component, + /obj/effect/decal/remains/mouse, + /obj/item/stack/material/steel{amount = 20} + ) + + uncommon_loot = list( + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rigged, + /obj/item/mecha_parts/mecha_equipment/generator + ) + + rare_loot = list( + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg, + /obj/item/mecha_parts/mecha_equipment/generator/nuclear + ) + +// Stuff you may find attached to a livewire mouse tank. +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/datum/element/lootable/mecha/mouse_tank/livewire + + uncommon_loot = list( + /obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer/rigged, + /obj/item/mecha_parts/mecha_equipment/tool/extinguisher + ) + + rare_loot = list( + /obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer, + /obj/item/mecha_parts/mecha_equipment/generator + ) + +// Stuff you may find attached to a eraticator mouse tank. +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/datum/element/lootable/mecha/mouse_tank/eraticator + + uncommon_loot = list( + /obj/item/ammo_magazine/m75, + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/mortar + ) + + rare_loot = list( + /obj/item/gun/projectile/gyropistol, + /obj/item/mecha_parts/mecha_equipment/generator/nuclear + ) diff --git a/code/datums/elements/sellable.dm b/code/datums/elements/sellable.dm index 59258661b6..8232154b91 100644 --- a/code/datums/elements/sellable.dm +++ b/code/datums/elements/sellable.dm @@ -173,7 +173,6 @@ GLOB.refined_chems_sold[R.industrial_use]["units"] += FLOOR(R.volume, 1) GLOB.refined_chems_sold[R.industrial_use]["value"] += reagent_value -//CHOMPEdit Start /datum/element/sellable/salvage //For selling /obj/item/salvage /datum/element/sellable/salvage/calculate_sell_value(obj/source) @@ -192,4 +191,3 @@ if(organ_stuff.health != initial(organ_stuff.health) ) return "Error: Product was damaged on arrival." return null -//CHOMPEdit End diff --git a/code/game/gamemodes/cult/construct_spells.dm b/code/game/gamemodes/cult/construct_spells.dm index 5eef8060d3..6c171afd5e 100644 --- a/code/game/gamemodes/cult/construct_spells.dm +++ b/code/game/gamemodes/cult/construct_spells.dm @@ -578,6 +578,17 @@ tracer_type = /obj/effect/projectile/tracer/inversion impact_type = /obj/effect/projectile/impact/inversion +/obj/item/projectile/energy/inversion + name = "inversion blast" + icon = 'icons/obj/projectiles_impact.dmi' + icon_state = "impact_invert" + damage = 30 + armor_penetration = 60 + damage_type = BURN + check_armour = "laser" + color = "#ffffff" + fire_sound = 'sound/weapons/spiderlunge.ogg' + //Harvester Pain Orb /obj/item/spell/construct/spawner/agonizing_sphere @@ -672,3 +683,343 @@ user.visible_message(span_bold("\The [user]") + " lowers its fist.") return qdel(src) + + +//////////////////////////// +// Purity Construct - Bishop - Spells +//////////////////////////// + +/spell/targeted/construct_advanced/crippling_beam + name = "Crippling Beam" + desc = "Fire a crippling beam to hold down your enemies or prey." + + hud_state = "const_beam" + spell_obj = /obj/item/spell/construct/projectile/crippling_beam + +/obj/item/spell/construct/projectile/crippling_beam + name = "Crippling Beam" + icon_state = "generic" + desc = "Your manipulators fire crippling beam of dense light." + cast_methods = CAST_RANGED + spell_projectile = /obj/item/projectile/beam/crippling_beam + pre_shot_delay = 0 + cooldown = 50 + fire_sound = 'sound/weapons/spiderlunge.ogg' + +/obj/item/projectile/beam/crippling_beam + name = "Crippling Beam" + icon_state = "invert" + fire_sound = 'sound/weapons/spiderlunge.ogg' + damage = 20 + damage_type = BURN + check_armour = "laser" + armor_penetration = 60 + light_range = 2 + light_power = -2 + light_color = "#64B4E6" + + muzzle_type = /obj/effect/projectile/muzzle/laser_omni + tracer_type = /obj/effect/projectile/tracer/laser_omni + impact_type = /obj/effect/projectile/impact/laser_omni + +/obj/item/projectile/beam/crippling_beam/proc/bang(var/mob/living/carbon/M) + to_chat(M, span_danger("You hear a loud roar.")) + playsound(src, 'sound/effects/bang.ogg', 50, 1) + var/ear_safety = 0 + ear_safety = M.get_ear_protection() + if(ear_safety == 1) + M.Confuse(150) + else if (ear_safety > 1) + M.Confuse(30) + else if (!ear_safety) + M.Stun(10) + M.Weaken(2) + M.ear_damage += rand(1, 10) + M.ear_deaf = max(M.ear_deaf,15) + // M.deaf_loop.start() // used Downstream + if (M.ear_damage >= 15) + to_chat(M, span_danger("Your ears start to ring badly!")) + if (prob(M.ear_damage - 5)) + to_chat(M, span_danger("You can't hear anything!")) + M.sdisabilities |= DEAF + // M.deaf_loop.start() // used Downstream + else + if (M.ear_damage >= 5) + to_chat(M, span_danger("Your ears start to ring!")) + M.update_icons() + +/obj/item/projectile/beam/crippling_beam/on_hit(var/atom/target) + bang(target) + . = ..() + +/spell/targeted/construct_advanced/banishment + name = "banishment" + desc = "Fire a searing beam of light, banishing unholy foes." + + hud_state = "const_beam" + spell_obj = /obj/item/spell/construct/projectile/banishment + +/obj/item/spell/construct/projectile/banishment + name = "banishment" + icon_state = "generic" + desc = "Your manipulators fire searing beams of light." + cast_methods = CAST_RANGED + spell_projectile = /obj/item/projectile/beam/banishment + pre_shot_delay = 0 + cooldown = 10 + fire_sound = 'sound/weapons/spiderlunge.ogg' + +/obj/item/projectile/beam/banishment + name = "banishment" + icon_state = "invert" + fire_sound = 'sound/weapons/spiderlunge.ogg' + damage = 15 + damage_type = BURN + mob_bonus_damage = 45 + check_armour = "laser" + armor_penetration = 60 + light_range = 2 + light_power = -2 + light_color = "#64B4E6" + + muzzle_type = /obj/effect/projectile/muzzle/lightning + tracer_type = /obj/effect/projectile/tracer/lightning + impact_type = /obj/effect/projectile/impact/lightning + +/obj/item/projectile/beam/banishment/proc/banish(var/mob/living/simple_mob/construct) + if(construct) + construct.Stun(10) + construct.Weaken(2) + else + return + +/obj/item/projectile/beam/banishment/on_hit(var/atom/target) + banish(target) + . = ..() + +//////////////////////////// +// Purity Construct - Deacon - Spells +//////////////////////////// + +///Deacon Laser +/spell/targeted/construct_advanced/force_beam + name = "Force Beam" + desc = "Fire a beam of kinetic energy to force back troublemakers." + + hud_state = "const_beam" + spell_obj = /obj/item/spell/construct/projectile/force_beam + +/obj/item/spell/construct/projectile/force_beam + name = "force_beam" + icon_state = "generic" + desc = "Your manipulators fire a condensed beam of kinetic energy." + cast_methods = CAST_RANGED + spell_projectile = /obj/item/projectile/beam/force_beam + pre_shot_delay = 0 + cooldown = 5 + fire_sound = 'sound/weapons/spiderlunge.ogg' + +/obj/item/projectile/beam/force_beam + name = "force beam" + icon_state = "invert" + fire_sound = 'sound/weapons/spiderlunge.ogg' + damage = 5 + damage_type = BRUTE + check_armour = "melee" + armor_penetration = 60 + light_range = 2 + light_power = -2 + light_color = "#64B4E6" + + muzzle_type = /obj/effect/projectile/muzzle/tungsten + tracer_type = /obj/effect/projectile/tracer/tungsten + impact_type = /obj/effect/projectile/impact/tungsten + +/obj/item/projectile/beam/force_beam/on_hit(var/atom/movable/target, var/blocked = 0) + if(isliving(target)) + var/mob/living/L = target + if(prob(40) && !blocked) + L.Stun(1) + L.Confuse(1) + + +///Deacon Healing Sphere +/spell/targeted/construct_advanced/soothing_sphere + name = "Sphere of soothing" + desc = "Rend a portal into a plane of sothing energy at the target location." + + charge_max = 100 + + hud_state = "const_harvest" + spell_obj = /obj/item/spell/construct/spawner/soothing_sphere + +/obj/item/spell/construct/spawner/soothing_sphere + name = "sphere of soothing" + desc = "Call forth a portal to a dimension of soothing energies at your target." + + spawner_type = /obj/effect/temporary_effect/pulse/soothing_sphere + +/obj/item/spell/construct/spawner/soothing_sphere/on_ranged_cast(atom/hit_atom, mob/user) + if(within_range(hit_atom) && pay_energy(10)) + ..() + +/obj/item/spell/construct/spawner/soothing_sphere/on_throw_cast(atom/hit_atom, mob/user) + pay_energy(5) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom + L.add_modifier(/datum/modifier/soothe, 10 SECONDS) + +/obj/effect/temporary_effect/pulse/soothing_sphere + name = "soothing sphere" + desc = "A portal to some hellish place. Its screams wrack your body with pain." + icon = 'icons/effects/effects.dmi' + icon_state = "blue_static_sphere" + time_to_die = null + light_range = 4 + light_power = 5 + light_color = "#64B4E6" + light_on = TRUE + pulses_remaining = 10 + pulse_delay = 1 SECOND + +/obj/effect/temporary_effect/pulse/soothing_sphere/on_pulse() + for(var/mob/living/L in view(4,src)) + if(!iscultist(L) && !istype(L, /mob/living/simple_mob/construct)) + L.add_modifier(/datum/modifier/soothe, 2 SECONDS) + L.adjustBruteLoss(rand(-5,-10)) + L.adjustFireLoss(rand(-5,-10)) + +/datum/modifier/soothe + name = "soothe" + desc = "Your body is soothed of pain." + + on_created_text = span_notice("A blue lightning quickly covers your body. Pain quickly fading.") + on_expired_text = span_notice("The lightning fades, and so too does the ongoing soothing of pain.") + + stacks = MODIFIER_STACK_EXTEND + + mob_overlay_state = "blue_electricity_constant" + +/datum/modifier/soothe/tick() + spawn() + if(ishuman(holder)) + var/mob/living/carbon/human/H = holder + H.apply_effect(-20, AGONY) + if(prob(10)) + to_chat(H, span_warning("It feels so comforting!")) + +//////////////////////////// +// Purity Construct - Priest - Spells +//////////////////////////// + +/spell/targeted/construct_advanced/mend_purity + name = "Mend Purity" + desc = "Mend a target living being or construct over time." + + charge_max = 100 + + hud_state = "const_mend" + spell_obj = /obj/item/spell/construct/mend_purity + +/obj/item/spell/construct/mend_purity + name = "Mend Purity" + desc = "Mend the wounds of constructs or living beings overtime." + icon_state = "mend_wounds" + cast_methods = CAST_MELEE + aspect = ASPECT_UNHOLY + light_color = "#64B4E6" + light_power = -2 + light_on = TRUE + +/obj/item/spell/construct/mend_purity/on_melee_cast(atom/hit_atom, mob/living/user, def_zone) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom + L.add_modifier(/datum/modifier/mend_purity, 150) + qdel(src) + +/datum/modifier/mend_purity + name = "holy mending" + desc = "Your body is mending, rejoice!" + + on_created_text = span_notice("A holy light envelops your body as it begins to mend.") + on_expired_text = span_notice("The cloak of unease dissipates.") + + stacks = MODIFIER_STACK_EXTEND + + mob_overlay_state = "blue_electricity_constant" + +/datum/modifier/mend_purity/tick() + spawn() + if(isliving(holder)) + var/mob/living/L = holder + if(istype(L, /mob/living/simple_mob/construct)) + L.adjustBruteLoss(rand(-5,-10)) + L.adjustFireLoss(rand(-5,-10)) + else + L.adjustBruteLoss(-2) + L.adjustFireLoss(-2) + + if(ishuman(holder)) + var/mob/living/carbon/human/H = holder + + for(var/obj/item/organ/O in H.internal_organs) + if(O.damage > 0) + O.damage = max(O.damage - 2, 0) + if(O.damage <= 5 && O.organ_tag == O_EYES) + H.sdisabilities &= ~BLIND + + for(var/obj/item/organ/external/O in H.organs) + O.heal_damage(rand(1,3), rand(1,3), internal = 1, robo_repair = 1) + + for(var/obj/item/organ/E in H.bad_external_organs) + var/obj/item/organ/external/affected = E + if((affected.damage < affected.min_broken_damage * CONFIG_GET(number/organ_health_multiplier)) && (affected.status & ORGAN_BROKEN)) + affected.status &= ~ORGAN_BROKEN + + for(var/datum/wound/W in affected.wounds) + if(istype(W, /datum/wound/internal_bleeding)) + affected.wounds -= W + affected.update_damages() + + H.restore_blood() + if(iscultist(H)) + H.apply_effect(100, AGONY)//it will heal cultists but purity really doesn't like them so causes much pain + if(prob(10)) + to_chat(H, span_danger("It feels as though your body is being torn apart!")) + L.updatehealth() + +/spell/targeted/purity_repair_aura + name = "Repair Aura" + desc = "Emit a field of energy around your shell to repair nearby constructs at range." + + range = -1 + school = "evocation" + charge_type = Sp_RECHARGE + invocation_type = SpI_NONE + + spell_flags = CONSTRUCT_CHECK | INCLUDEUSER + + hud_state = "const_repairaura" + smoke_amt = 0 + + charge_max = 600 + +/spell/targeted/purity_repair_aura/cast(list/targets, mob/living/user) + if(findNullRod(user) || user.has_modifier_of_type(/datum/modifier/repair_aura)) + charge_counter = 300 + return + user.add_modifier(/datum/modifier/repair_aura_purity, 30 SECONDS) + +/datum/modifier/repair_aura_purity + name = "aura of repair (purity)" + desc = "You are emitting a field of strange energy, capable of repairing constructs." + + on_created_text = span_notice("You begin emitting an purity repair aura.") + on_expired_text = span_notice("The purity repair aura fades.") + stacks = MODIFIER_STACK_EXTEND + +/datum/modifier/repair_aura_purity/tick() + spawn() + for(var/mob/living/simple_mob/construct/T in view(4,holder)) + T.adjustBruteLoss(rand(-10,-15)) + T.adjustFireLoss(rand(-10,-15)) diff --git a/code/game/gamemodes/cult/construct_spells_ch.dm b/code/game/gamemodes/cult/construct_spells_ch.dm deleted file mode 100644 index dc8a3d8047..0000000000 --- a/code/game/gamemodes/cult/construct_spells_ch.dm +++ /dev/null @@ -1,339 +0,0 @@ - -//////////////////////////// -// Purity Construct - Bishop - Spells -//////////////////////////// - -/spell/targeted/construct_advanced/crippling_beam - name = "Crippling Beam" - desc = "Fire a crippling beam to hold down your enemies or prey." - - hud_state = "const_beam" - spell_obj = /obj/item/spell/construct/projectile/crippling_beam - -/obj/item/spell/construct/projectile/crippling_beam - name = "Crippling Beam" - icon_state = "generic" - desc = "Your manipulators fire crippling beam of dense light." - cast_methods = CAST_RANGED - spell_projectile = /obj/item/projectile/beam/crippling_beam - pre_shot_delay = 0 - cooldown = 50 - fire_sound = 'sound/weapons/spiderlunge.ogg' - -/obj/item/projectile/beam/crippling_beam - name = "Crippling Beam" - icon_state = "invert" - fire_sound = 'sound/weapons/spiderlunge.ogg' - damage = 20 - damage_type = BURN - check_armour = "laser" - armor_penetration = 60 - light_range = 2 - light_power = -2 - light_color = "#64B4E6" - - muzzle_type = /obj/effect/projectile/muzzle/laser_omni - tracer_type = /obj/effect/projectile/tracer/laser_omni - impact_type = /obj/effect/projectile/impact/laser_omni - -/obj/item/projectile/beam/crippling_beam/proc/bang(var/mob/living/carbon/M) - to_chat(M, span_danger("You hear a loud roar.")) - playsound(src, 'sound/effects/bang.ogg', 50, 1) - var/ear_safety = 0 - ear_safety = M.get_ear_protection() - if(ear_safety == 1) - M.Confuse(150) - else if (ear_safety > 1) - M.Confuse(30) - else if (!ear_safety) - M.Stun(10) - M.Weaken(2) - M.ear_damage += rand(1, 10) - M.ear_deaf = max(M.ear_deaf,15) - M.deaf_loop.start() - if (M.ear_damage >= 15) - to_chat(M, span_danger("Your ears start to ring badly!")) - if (prob(M.ear_damage - 5)) - to_chat(M, span_danger("You can't hear anything!")) - M.sdisabilities |= DEAF - M.deaf_loop.start() - else - if (M.ear_damage >= 5) - to_chat(M, span_danger("Your ears start to ring!")) - M.update_icons() - -/obj/item/projectile/beam/crippling_beam/on_hit(var/atom/target) - bang(target) - . = ..() - -/spell/targeted/construct_advanced/banishment - name = "banishment" - desc = "Fire a searing beam of light, banishing unholy foes." - - hud_state = "const_beam" - spell_obj = /obj/item/spell/construct/projectile/banishment - -/obj/item/spell/construct/projectile/banishment - name = "banishment" - icon_state = "generic" - desc = "Your manipulators fire searing beams of light." - cast_methods = CAST_RANGED - spell_projectile = /obj/item/projectile/beam/banishment - pre_shot_delay = 0 - cooldown = 10 - fire_sound = 'sound/weapons/spiderlunge.ogg' - -/obj/item/projectile/beam/banishment - name = "banishment" - icon_state = "invert" - fire_sound = 'sound/weapons/spiderlunge.ogg' - damage = 15 - damage_type = BURN - mob_bonus_damage = 45 - check_armour = "laser" - armor_penetration = 60 - light_range = 2 - light_power = -2 - light_color = "#64B4E6" - - muzzle_type = /obj/effect/projectile/muzzle/lightning - tracer_type = /obj/effect/projectile/tracer/lightning - impact_type = /obj/effect/projectile/impact/lightning - -/obj/item/projectile/beam/banishment/proc/banish(var/mob/living/simple_mob/construct) - if(construct) - construct.Stun(10) - construct.Weaken(2) - else - return - -/obj/item/projectile/beam/banishment/on_hit(var/atom/target) - banish(target) - . = ..() - -//////////////////////////// -// Purity Construct - Deacon - Spells -//////////////////////////// - -///Deacon Laser -/spell/targeted/construct_advanced/force_beam - name = "Force Beam" - desc = "Fire a beam of kinetic energy to force back troublemakers." - - hud_state = "const_beam" - spell_obj = /obj/item/spell/construct/projectile/force_beam - -/obj/item/spell/construct/projectile/force_beam - name = "force_beam" - icon_state = "generic" - desc = "Your manipulators fire a condensed beam of kinetic energy." - cast_methods = CAST_RANGED - spell_projectile = /obj/item/projectile/beam/force_beam - pre_shot_delay = 0 - cooldown = 5 - fire_sound = 'sound/weapons/spiderlunge.ogg' - -/obj/item/projectile/beam/force_beam - name = "force beam" - icon_state = "invert" - fire_sound = 'sound/weapons/spiderlunge.ogg' - damage = 5 - damage_type = BRUTE - check_armour = "melee" - armor_penetration = 60 - light_range = 2 - light_power = -2 - light_color = "#64B4E6" - - muzzle_type = /obj/effect/projectile/muzzle/tungsten - tracer_type = /obj/effect/projectile/tracer/tungsten - impact_type = /obj/effect/projectile/impact/tungsten - -/obj/item/projectile/beam/force_beam/on_hit(var/atom/movable/target, var/blocked = 0) - if(isliving(target)) - var/mob/living/L = target - if(prob(40) && !blocked) - L.Stun(1) - L.Confuse(1) - - -///Deacon Healing Sphere -/spell/targeted/construct_advanced/soothing_sphere - name = "Sphere of soothing" - desc = "Rend a portal into a plane of sothing energy at the target location." - - charge_max = 100 - - hud_state = "const_harvest" - spell_obj = /obj/item/spell/construct/spawner/soothing_sphere - -/obj/item/spell/construct/spawner/soothing_sphere - name = "sphere of soothing" - desc = "Call forth a portal to a dimension of soothing energies at your target." - - spawner_type = /obj/effect/temporary_effect/pulse/soothing_sphere - -/obj/item/spell/construct/spawner/soothing_sphere/on_ranged_cast(atom/hit_atom, mob/user) - if(within_range(hit_atom) && pay_energy(10)) - ..() - -/obj/item/spell/construct/spawner/soothing_sphere/on_throw_cast(atom/hit_atom, mob/user) - pay_energy(5) - if(isliving(hit_atom)) - var/mob/living/L = hit_atom - L.add_modifier(/datum/modifier/soothe, 10 SECONDS) - -/obj/effect/temporary_effect/pulse/soothing_sphere - name = "soothing sphere" - desc = "A portal to some hellish place. Its screams wrack your body with pain." - icon = 'icons/effects/effects.dmi' - icon_state = "blue_static_sphere" - time_to_die = null - light_range = 4 - light_power = 5 - light_color = "#64B4E6" - light_on = TRUE - pulses_remaining = 10 - pulse_delay = 1 SECOND - -/obj/effect/temporary_effect/pulse/soothing_sphere/on_pulse() - for(var/mob/living/L in view(4,src)) - if(!iscultist(L) && !istype(L, /mob/living/simple_mob/construct)) - L.add_modifier(/datum/modifier/soothe, 2 SECONDS) - L.adjustBruteLoss(rand(-5,-10)) - L.adjustFireLoss(rand(-5,-10)) - -/datum/modifier/soothe - name = "soothe" - desc = "Your body is soothed of pain." - - on_created_text = span_notice("A blue lightning quickly covers your body. Pain quickly fading.") - on_expired_text = span_notice("The lightning fades, and so too does the ongoing soothing of pain.") - - stacks = MODIFIER_STACK_EXTEND - - mob_overlay_state = "blue_electricity_constant" - -/datum/modifier/soothe/tick() - spawn() - if(ishuman(holder)) - var/mob/living/carbon/human/H = holder - H.apply_effect(-20, AGONY) - if(prob(10)) - to_chat(H, span_warning("It feels so comforting!")) - -//////////////////////////// -// Purity Construct - Priest - Spells -//////////////////////////// - -/spell/targeted/construct_advanced/mend_purity - name = "Mend Purity" - desc = "Mend a target living being or construct over time." - - charge_max = 100 - - hud_state = "const_mend" - spell_obj = /obj/item/spell/construct/mend_purity - -/obj/item/spell/construct/mend_purity - name = "Mend Purity" - desc = "Mend the wounds of constructs or living beings overtime." - icon_state = "mend_wounds" - cast_methods = CAST_MELEE - aspect = ASPECT_UNHOLY - light_color = "#64B4E6" - light_power = -2 - light_on = TRUE - -/obj/item/spell/construct/mend_purity/on_melee_cast(atom/hit_atom, mob/living/user, def_zone) - if(isliving(hit_atom)) - var/mob/living/L = hit_atom - L.add_modifier(/datum/modifier/mend_purity, 150) - qdel(src) - -/datum/modifier/mend_purity - name = "holy mending" - desc = "Your body is mending, rejoice!" - - on_created_text = span_notice("A holy light envelops your body as it begins to mend.") - on_expired_text = span_notice("The cloak of unease dissipates.") - - stacks = MODIFIER_STACK_EXTEND - - mob_overlay_state = "blue_electricity_constant" - -/datum/modifier/mend_purity/tick() - spawn() - if(isliving(holder)) - var/mob/living/L = holder - if(istype(L, /mob/living/simple_mob/construct)) - L.adjustBruteLoss(rand(-5,-10)) - L.adjustFireLoss(rand(-5,-10)) - else - L.adjustBruteLoss(-2) - L.adjustFireLoss(-2) - - if(ishuman(holder)) - var/mob/living/carbon/human/H = holder - - for(var/obj/item/organ/O in H.internal_organs) - if(O.damage > 0) - O.damage = max(O.damage - 2, 0) - if(O.damage <= 5 && O.organ_tag == O_EYES) - H.sdisabilities &= ~BLIND - - for(var/obj/item/organ/external/O in H.organs) - O.heal_damage(rand(1,3), rand(1,3), internal = 1, robo_repair = 1) - - for(var/obj/item/organ/E in H.bad_external_organs) - var/obj/item/organ/external/affected = E - if((affected.damage < affected.min_broken_damage * CONFIG_GET(number/organ_health_multiplier)) && (affected.status & ORGAN_BROKEN)) // CHOMPEdit - affected.status &= ~ORGAN_BROKEN - - for(var/datum/wound/W in affected.wounds) - if(istype(W, /datum/wound/internal_bleeding)) - affected.wounds -= W - affected.update_damages() - - H.restore_blood() - if(iscultist(H)) - H.apply_effect(100, AGONY)//it will heal cultists but purity really doesn't like them so causes much pain - if(prob(10)) - to_chat(H, span_danger("It feels as though your body is being torn apart!")) - L.updatehealth() - -/spell/targeted/purity_repair_aura - name = "Repair Aura" - desc = "Emit a field of energy around your shell to repair nearby constructs at range." - - range = -1 - school = "evocation" - charge_type = Sp_RECHARGE - invocation_type = SpI_NONE - - spell_flags = CONSTRUCT_CHECK | INCLUDEUSER - - hud_state = "const_repairaura" - smoke_amt = 0 - - charge_max = 600 - -/spell/targeted/purity_repair_aura/cast(list/targets, mob/living/user) - if(findNullRod(user) || user.has_modifier_of_type(/datum/modifier/repair_aura)) - charge_counter = 300 - return - user.add_modifier(/datum/modifier/repair_aura_purity, 30 SECONDS) - -/datum/modifier/repair_aura_purity - name = "aura of repair (purity)" - desc = "You are emitting a field of strange energy, capable of repairing constructs." - - on_created_text = span_notice("You begin emitting an purity repair aura.") - on_expired_text = span_notice("The purity repair aura fades.") - stacks = MODIFIER_STACK_EXTEND - -/datum/modifier/repair_aura_purity/tick() - spawn() - for(var/mob/living/simple_mob/construct/T in view(4,holder)) - T.adjustBruteLoss(rand(-10,-15)) - T.adjustFireLoss(rand(-10,-15)) diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm index cf3634a939..8ac509b3de 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -133,7 +133,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) var/rotation_speed = 4.5 SECONDS //How quickly we turn to face threats var/datum/weakref/engaging = null // The meteor we're shooting at var/id_tag = null - var/fire_sounds = list('sound/weapons/frigate_turret/frigate_turret_fire1.ogg', 'sound/weapons/frigate_turret/frigate_turret_fire2.ogg', 'sound/weapons/frigate_turret/frigate_turret_fire3.ogg', 'sound/weapons/frigate_turret/frigate_turret_fire4.ogg') // CHOMPEdit: Pew + var/fire_sounds = list('sound/weapons/frigate_turret/frigate_turret_fire1.ogg', 'sound/weapons/frigate_turret/frigate_turret_fire2.ogg', 'sound/weapons/frigate_turret/frigate_turret_fire3.ogg', 'sound/weapons/frigate_turret/frigate_turret_fire4.ogg') /obj/machinery/pointdefense/Initialize(mapload) . = ..() diff --git a/code/game/objects/effects/decals/Cleanable/vore.dm b/code/game/objects/effects/decals/Cleanable/vore.dm index 6378cfb4b5..936adec6d9 100644 --- a/code/game/objects/effects/decals/Cleanable/vore.dm +++ b/code/game/objects/effects/decals/Cleanable/vore.dm @@ -1,5 +1,3 @@ -////////////CHOMP CLEANABLE REAGENT PUDDLES///////////////////// - /obj/effect/decal/cleanable/blood/reagent //Yes, we are using the blood system for this name = "liquid" dryname = "dried liquid" diff --git a/modular_chomp/code/game/objects/items/devices/vacpack.dm b/code/game/objects/items/devices/vacpack.dm similarity index 97% rename from modular_chomp/code/game/objects/items/devices/vacpack.dm rename to code/game/objects/items/devices/vacpack.dm index 069d899406..f8413332c9 100644 --- a/modular_chomp/code/game/objects/items/devices/vacpack.dm +++ b/code/game/objects/items/devices/vacpack.dm @@ -2,8 +2,8 @@ /obj/item/vac_attachment name = "\improper Vac-Pack attachment" desc = "Useful for slurping mess off the floors. Even things and stuff depending on settings. Can be connected to a trash bag or vore belly. On-mob sprites can be toggled via verb in Objects tab." - icon = 'modular_chomp/icons/mob/vacpack.dmi' - icon_override = 'modular_chomp/icons/mob/vacpack.dmi' + icon = 'icons/mob/vacpack.dmi' + icon_override = 'icons/mob/vacpack.dmi' icon_state = "sucker_drop" item_state = "sucker" slot_flags = SLOT_BELT | SLOT_BACK @@ -76,6 +76,8 @@ return if(!output_dest) return + if(istype(target,/obj/structure/window) || istype(target,/obj/structure/grille)) + target = get_turf(target) // Windows can be clicked to clean their turf if(istype(output_dest,/obj/item/storage/bag/trash)) if(get_turf(output_dest) != get_turf(user)) vac_power = 0 diff --git a/code/game/objects/mob_spawner_vr.dm b/code/game/objects/mob_spawner_vr.dm index 8c4ac65214..9c954bdf14 100644 --- a/code/game/objects/mob_spawner_vr.dm +++ b/code/game/objects/mob_spawner_vr.dm @@ -269,3 +269,72 @@ It also makes it so a ghost wont know where all the goodies/mobs are. spawn_types = list( /mob/living/simple_mob/animal/space/alien/queen = 5, ) + +/obj/structure/mob_spawner/scanner/mining_animals + name = "Mining Lazy Spawner" + spawn_delay = 10 MINUTES + range = 10 + simultaneous_spawns = 1 + mob_faction = "wild animal" + total_spawns = 2 + destructible = 0 + anchored = 1 + invisibility = INVISIBILITY_ABSTRACT + spawn_types = list( + /mob/living/simple_mob/vore/bat = 70, + /mob/living/simple_mob/animal/passive/cockroach = 60, + /obj/effect/spider/spiderling/non_growing = 50, + /mob/living/simple_mob/animal/giant_spider/tunneler/cave = 50, + /mob/living/simple_mob/vore/jelly = 40, + /mob/living/simple_mob/vore/aggressive/rat = 30, + /mob/living/simple_mob/animal/passive/mouse = 30, + /mob/living/simple_mob/animal/passive/mouse/rat = 25, + /mob/living/simple_mob/metroid/mine = 25, // Downstream //CHOMPEnable + /mob/living/simple_mob/vore/oregrub = 25, + /mob/living/simple_mob/vore/aggressive/dino = 20, + /mob/living/simple_mob/animal/space/carp = 20, + /mob/living/simple_mob/vore/oregrub/lava = 15, + /mob/living/simple_mob/vore/stalker = 10, + /mob/living/simple_mob/vore/lamia/copper/cave = 10, + /mob/living/simple_mob/vore/lamia/albino/cave = 5, + /mob/living/simple_mob/vore/aggressive/lizardman = 5, + /mob/living/simple_mob/vore/otie = 5, + /mob/living/simple_mob/animal/passive/pillbug = 5, // These aren't dangerous, but are made rare just because few people are going to bother killing them. + /obj/structure/closet/crate/mimic/cointoss = 1, + /obj/structure/closet/crate/mimic/closet/cointoss = 1, + /mob/living/simple_mob/vore/otie/feral = 1, + // /mob/living/simple_mob/vore/sonadile = 1, // Removed until sprite issues fixed. + /mob/living/simple_mob/animal/space/bear/brown = 1, + /mob/living/simple_mob/vore/aggressive/deathclaw = 1, + /mob/living/simple_mob/vore/gryphon = 1, + /mob/living/simple_mob/vore/demon = 0.5 // VERY rare! + ) + +/obj/structure/mob_spawner/proc/get_used_report(var/obj/structure/closet/crate/mimic/O) + if(O in spawned_mobs) + spawned_mobs.Remove(O) + +/obj/structure/mob_spawner/mouse_nest/mousehole + name = "small hole" + desc = "A small hole, critters seem to move in and out from here." + icon = 'icons/effects/effects.dmi' + icon_state = "tunnel_hole" + spawn_types = list( + /mob/living/simple_mob/animal/passive/mouse = 100, + /mob/living/simple_mob/animal/passive/cockroach = 25, + /mob/living/simple_mob/animal/passive/mouse/rat/strong = 10, // Because I'm a horrible person. <3 + /obj/effect/spider/spiderling/non_growing = 5) + +/obj/structure/mob_spawner/mouse_nest/mousehole/Initialize(mapload) + . = ..() + icon_state = "tunnel_hole" + +/obj/structure/mob_spawner/recycler + desc = "A bizarre mess of robotic limbs, glowing microrefineries, and nanoassemblers gradually converting the pile of raw materials into active hivebots." + destructible = 1 + icon = 'icons/obj/recycling.dmi' + icon_state = "grinder-b1" + name = "hivebot assembler" + simultaneous_spawns = 6 + spawn_delay = 300 + spawn_types = list(/mob/living/simple_mob/mechanical/hivebot/swarm = 200, /mob/living/simple_mob/mechanical/hivebot/ranged_damage/basic = 50, /mob/living/simple_mob/mechanical/hivebot/ranged_damage/laser = 25, /mob/living/simple_mob/mechanical/hivebot/ranged_damage/ion = 10, /mob/living/simple_mob/mechanical/hivebot/tank/meatshield = 10) diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index 31359191c4..b35c25f2b2 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -49,6 +49,7 @@ qdel(newPred.ai_holder) newPred.ai_holder = null //newPred.movement_cooldown = 0 // The "needless artificial speed cap" exists for a reason + // R.has_hands = TRUE // Downstream if(M.mind) M.mind.transfer_to(newPred) to_chat(M, span_notice("You are " + span_bold("[newPred]") + ", somehow having gotten aboard the station in search of food. \ diff --git a/code/game/objects/structures/ghost_pods/mysterious.dm b/code/game/objects/structures/ghost_pods/mysterious.dm index d25d2a752c..5a96adb311 100644 --- a/code/game/objects/structures/ghost_pods/mysterious.dm +++ b/code/game/objects/structures/ghost_pods/mysterious.dm @@ -16,6 +16,7 @@ lightning_strike(get_turf(src), cosmetic = TRUE) density = FALSE var/mob/living/simple_mob/animal/passive/dog/corgi/R = new(get_turf(src)) + // R.has_hands = TRUE // Downstream if(M.mind) M.mind.transfer_to(R) to_chat(M, span_notice("You are a Corgi! Woof!")) diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm index 086685662f..7ac4dc6468 100644 --- a/code/game/objects/structures/loot_piles.dm +++ b/code/game/objects/structures/loot_piles.dm @@ -209,3 +209,42 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh icon_state = "medicine_cabinet" density = FALSE loot_element_path = /datum/element/lootable/fresh_medicine + +//Micro mecha loot. +/obj/structure/loot_pile/mecha/mouse_tank + name = "\improper Whisker wreckage" + desc = "The ruins of a small tank. Perhaps some child's toy?" + icon = 'icons/mob/mouse_army.dmi' + icon_state = "whisker-broken" + density = TRUE + anchored = FALSE // In case a dead mecha-mob dies in a bad spot. + + loot_element_path = /datum/element/lootable/mecha/mouse_tank + +/obj/structure/loot_pile/mecha/mouse_tank/livewire + name = "\improper Livewire wreckage" + desc = "The smoldering ruins of a small tank. Perhaps some child's toy?" + icon_state = "livewire-broken" + density = TRUE + anchored = FALSE // In case a dead mecha-mob dies in a bad spot. + + loot_element_path = /datum/element/lootable/mecha/mouse_tank/livewire + +/obj/structure/loot_pile/mecha/mouse_tank/eraticator + name = "\improper Eraticator wreckage" + desc = "The blasted ruins of a small tank. Perhaps some child's toy?" + icon_state = "eraticator-broken" + density = TRUE + anchored = FALSE // In case a dead mecha-mob dies in a b + + loot_element_path = /datum/element/lootable/mecha/mouse_tank/eraticator + +/obj/structure/loot_pile/mecha/ripley/pirate + icon = 'icons/mob/pirates.dmi' + icon_state = "pirate-broken" + +/obj/structure/loot_pile/maint/technical + density = FALSE + +/obj/structure/loot_pile/maint/boxfort + density = FALSE diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 781a414d6e..db86fdabb6 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -227,11 +227,9 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_HOLDER, "Show Player Panel", m if(!f) body += " | " else f = 0 if(L in player.languages) - k = span_green(k) - body += "[k]" + body += "[span_green(k)]" else - k = span_red(k) - body += "[k]" + body += "[span_red(k)]" body += {"
"} diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 15163ed5f1..68fd75f5a4 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1869,7 +1869,7 @@ to_chat(usr, span_filter_adminlog("Failed to remove language '[lang2toggle]' from \the [M]!")) else if(!M.add_language(lang2toggle)) - to_chat(usr, span_filter_adminlog("Failed to add language '[lang2toggle]' from \the [M]!")) + to_chat(usr, span_filter_adminlog("Failed to add language '[lang2toggle]' to \the [M]!")) SSadmin_verbs.dynamic_invoke_verb(usr.client, /datum/admin_verb/show_player_panel, M) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 6bb56f7d19..9f65339359 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -142,7 +142,7 @@ ADMIN_VERB(drop_everything, R_ADMIN, "Drop Everything", ADMIN_VERB_NO_DESCRIPTIO if(!M) return - var/msg = tgui_input_text(usr, "Message:", text("Enter the text you wish to appear to your target:")) + var/msg = tgui_input_text(usr, "Message:", text("Enter the text you wish to appear to your target:"), encode = FALSE) if(msg && !(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'. msg = sanitize(msg) diff --git a/code/modules/ai/ai_holder_subtypes/simple_mob_ai.dm b/code/modules/ai/ai_holder_subtypes/simple_mob_ai.dm index ce5f17ae98..18b7c7d806 100644 --- a/code/modules/ai/ai_holder_subtypes/simple_mob_ai.dm +++ b/code/modules/ai/ai_holder_subtypes/simple_mob_ai.dm @@ -226,3 +226,17 @@ // For setting up possible stealth missions /datum/ai_holder/simple_mob/humanoid/hostile/guard_limit guard_limit = TRUE + +/datum/ai_holder/simple_mob/melee/pack_mob + cooperative = TRUE + call_distance = 28 // pack mobs should be able to communicate quite a ways - we can assume by howls/etc + can_flee = TRUE + mauling = TRUE // Kill/finish off unconscious people. + vision_range = 12 // This is a bit cheaty - normal vision range is 7 tiles, one screen, setting that to 10 allows us to track targets offscreen by up to 5 tiles, and make for an easier time keeping chase of targets. + flee_when_dying = TRUE // animals know to run when wounded/overmatched + flee_when_outmatched = TRUE // animals know to run when wounded/overmatched + +/datum/ai_holder/simple_mob/melee/pack_mob/post_melee_attack(atom/A) + if(holder.Adjacent(A)) + holder.IMove(get_step(holder, pick(GLOB.alldirs))) + holder.face_atom(A) diff --git a/code/modules/ai/ai_holder_subtypes/simple_mob_ai_ch.dm b/code/modules/ai/ai_holder_subtypes/simple_mob_ai_ch.dm deleted file mode 100644 index 0ffe995ee1..0000000000 --- a/code/modules/ai/ai_holder_subtypes/simple_mob_ai_ch.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/ai_holder/simple_mob/melee/pack_mob - cooperative = TRUE - call_distance = 28 // pack mobs should be able to communicate quite a ways - we can assume by howls/etc - can_flee = TRUE - mauling = TRUE // Kill/finish off unconscious people. - vision_range = 12 // This is a bit cheaty - normal vision range is 7 tiles, one screen, setting that to 10 allows us to track targets offscreen by up to 5 tiles, and make for an easier time keeping chase of targets. - flee_when_dying = TRUE // animals know to run when wounded/overmatched - flee_when_outmatched = TRUE // animals know to run when wounded/overmatched - -/datum/ai_holder/simple_mob/melee/pack_mob/post_melee_attack(atom/A) - if(holder.Adjacent(A)) - holder.IMove(get_step(holder, pick(GLOB.alldirs))) - holder.face_atom(A) diff --git a/code/modules/ai/say_list.dm b/code/modules/ai/say_list.dm index a944bce0f9..9bda39e216 100644 --- a/code/modules/ai/say_list.dm +++ b/code/modules/ai/say_list.dm @@ -137,3 +137,105 @@ /datum/say_list/crab emote_hear = list("hisses") + +/datum/say_list/possessed + speak = list("Where am I?", + "Why am I here?", + "Where did everyone go?") + + emote_hear = list("lets out a mournful cry.", "can be heard sobbing.", "groans out in pain.") + emote_see = list("kneels down for a moment, picking something up before casting it away.","stands as still as a statue.", "looks to be doing some kind of work.") + + say_maybe_target = list("Is there someone there?", "Who's there?") + say_got_target = list("You! You help people!", "Can you help me?", "I'm lost!") + say_threaten = list("Help me!", "Please help!", "Hey, who turned out the lights?", "Allonsy!", "Geronimo!") + say_stand_down = list("Please. Anyone. Help!", "Where is everyone?", "Where am I?") + say_escalate = list("Help!", "I'm sorry!", "I can't stop!", "I don't want to do this!", "I don't want to go!") + +//Vox Pirate Saylist +/datum/say_list/merc/voxpirate + speak = list("Lookings for scrap, yaya.", + "Tank is lookings low.", + "Knowings should haves stayed on the Ark.", + "Quills itchings...", + "Cravings Teshari on stick.", + "Plates locking up. Not good.") + emote_see = list("sniffs", "coughs", "taps his foot", "looks around", "checks his equipment") + + say_understood = list("Yayaya!") + say_cannot = list("Skreking negatives!", "Can't do that.") + say_maybe_target = list("Who's theres?", "Is hearing things?") + say_got_target = list("Dust!", "Easy loot!") + say_threaten = list("Gets out of heres!") + say_stand_down = list("Yaya, runs!", "Kikikiki!") + say_escalate = list("Skrek!", "Bringings it!", "Takings shot", "Lock claws!") + + + //Synth Horror Saylist + +/datum/say_list/cyber_horror + speak = list("H@!#$$P M@!$#", + "GHAA!@@#", + "KR@!!N", + "K!@@##L!@@ %!@#E", + "G@#!$ H@!#%", + "H!@%%@ @!E") + emote_hear = list("emits", "groans", "wails", "pleads") + emote_see = list ("stares unblinkingly.", "jitters and twitches.", "emits a synthetic scream.", "rapidly twitches.", "convulses.", "twitches uncontrollably.", "goes stock still.") + say_threaten = list ("FR@#DOM","EN@ T#I$-$","N0$ M^> B@!#") + say_got_target = list("I *#@ Y@%","!E@#$P","F#RR @I","D0@#$ ##OK %","IT $##TS") + +//Roach Saylists Woo Hoo +/datum/say_list/roach + speak = list("Chitter!","Chk chk!","Tchk?") + emote_hear = list("chitters","chirps","shuffles") + emote_see = list("rubs its antennae", "skitters", "clacks across the floor") + +/datum/say_list/merc/elite // colder. also, actually just assholes. + speak = list("I got better pay on my last job.", + "So, y'think we'll get to shoot anyone today?", + "Fuck, I hate those guys.", + "Would be nice for something to happen, for once.", + "Think those NT shits'll rear their heads?", + "Any of you see anything recently?") + emote_see = list("taps his foot", "looks around coldly", "checks his equipment", "rummages in his webbing") + say_understood = list("Aff.", "Affirmative.", "Copy.", "Understood.") + say_cannot = list("Neg.", "Negative.") + say_maybe_target = list("I heard something.") + say_got_target = list("Oh, good, I needed more range fodder.", "I'm going to enjoy this.", "I see you.", "Not quiet enough.") + say_threaten = list("Hoy, private property, fuck off.", "You're acting mighty bold for a bullet sponge.", "First and last warning; find somewhere else to be.", "I wouldn't do that if I were you.", "Back off or your field medic's getting a bonus.") + say_stand_down = list("Damn it, I was hoping you'd push your luck.", "What, that's it? Pussy.", "And don't come back.", "Good call. Don't do it again.", "Harrumph.", "That'll teach 'ya.") + say_escalate = list("Oh, I'm gonna enjoy this.", "I'm going to enjoy making you regret that.", "Last mistake you'll make.") + + +//Synth Horror Saylist + +/datum/say_list/cyber_horror + speak = list("H@!#$$P M@!$#", + "GHAA!@@#", + "KR@!!N", + "K!@@##L!@@ %!@#E", + "G@#!$ H@!#%", + "H!@%%@ @!E") + emote_hear = list("emits", "groans", "wails", "pleads") + emote_see = list ("stares unblinkingly.", "jitters and twitches.", "emits a synthetic scream.", "rapidly twitches.", "convulses.", "twitches uncontrollably.", "goes stock still.") + say_threaten = list ("FR@#DOM","EN@ T#I$-$","N0$ M^> B@!#") + say_got_target = list("I *#@ Y@%","!E@#$P","F#RR @I","D0@#$ ##OK %","IT $##TS") + + +// This one's pretty dumb, but pirates are dumb anyways. +/datum/say_list/pirate + speak = list("Yarr!", + "Yohoho and a bottle of rum...", + "Getting tried of hardtack.", + "What do you do with a drunken sailor...", + "One day We'll get that big score.", + "They ain't catching this pirate no-sir-ree") + + say_understood = list("Alright, matey.") + say_cannot = list("No, matey.") + say_maybe_target = list("Eh?", "Who goes there?") + say_got_target = list("Yarrrr!", "Just drop your loot and run") + say_threaten = list("You best leave, this booty is mine.", "No plank to walk on, just walk away.") + say_stand_down = list("Good.", "That's right run you lilly livers.") + say_escalate = list("Yarr! The booty is mine!", "Going to gut you landlubber.") diff --git a/code/modules/ai/say_list_ch.dm b/code/modules/ai/say_list_ch.dm deleted file mode 100644 index 50366a1d39..0000000000 --- a/code/modules/ai/say_list_ch.dm +++ /dev/null @@ -1,116 +0,0 @@ -//Vox Pirate Saylist -/datum/say_list/merc/voxpirate - speak = list("Lookings for scrap, yaya.", - "Tank is lookings low.", - "Knowings should haves stayed on the Ark.", - "Quills itchings...", - "Cravings Teshari on stick.", - "Plates locking up. Not good.") - emote_see = list("sniffs", "coughs", "taps his foot", "looks around", "checks his equipment") - - say_understood = list("Yayaya!") - say_cannot = list("Skreking negatives!", "Can't do that.") - say_maybe_target = list("Who's theres?", "Is hearing things?") - say_got_target = list("Dust!", "Easy loot!") - say_threaten = list("Gets out of heres!") - say_stand_down = list("Yaya, runs!", "Kikikiki!") - say_escalate = list("Skrek!", "Bringings it!", "Takings shot", "Lock claws!") - - - //Synth Horror Saylist - -/datum/say_list/cyber_horror - speak = list("H@!#$$P M@!$#", - "GHAA!@@#", - "KR@!!N", - "K!@@##L!@@ %!@#E", - "G@#!$ H@!#%", - "H!@%%@ @!E") - emote_hear = list("emits", "groans", "wails", "pleads") - emote_see = list ("stares unblinkingly.", "jitters and twitches.", "emits a synthetic scream.", "rapidly twitches.", "convulses.", "twitches uncontrollably.", "goes stock still.") - say_threaten = list ("FR@#DOM","EN@ T#I$-$","N0$ M^> B@!#") - say_got_target = list("I *#@ Y@%","!E@#$P","F#RR @I","D0@#$ ##OK %","IT $##TS") - -//Roach Saylists Woo Hoo -/datum/say_list/roach - speak = list("Chitter!","Chk chk!","Tchk?") - emote_hear = list("chitters","chirps","shuffles") - emote_see = list("rubs its antennae", "skitters", "clacks across the floor") - -/datum/say_list/possessed - speak = list("Where am I?", - "Why am I here?", - "Where did everyone go?") - - emote_hear = list("lets out a mournful cry.", "can be heard sobbing.", "groans out in pain.") - emote_see = list("kneels down for a moment, picking something up before casting it away.","stands as still as a statue.", "looks to be doing some kind of work.") - - say_maybe_target = list("Is there someone there?", "Who's there?") - say_got_target = list("You! You help people!", "Can you help me?", "I'm lost!") - say_threaten = list("Help me!", "Please help!", "Hey, who turned out the lights?", "Allonsy!", "Geronimo!") - say_stand_down = list("Please. Anyone. Help!", "Where is everyone?", "Where am I?") - say_escalate = list("Help!", "I'm sorry!", "I can't stop!", "I don't want to do this!", "I don't want to go!") - -/datum/say_list/merc/elite // colder. also, actually just assholes. - speak = list("I got better pay on my last job.", - "So, y'think we'll get to shoot anyone today?", - "Fuck, I hate those guys.", - "Would be nice for something to happen, for once.", - "Think those NT shits'll rear their heads?", - "Any of you see anything recently?") - emote_see = list("taps his foot", "looks around coldly", "checks his equipment", "rummages in his webbing") - say_understood = list("Aff.", "Affirmative.", "Copy.", "Understood.") - say_cannot = list("Neg.", "Negative.") - say_maybe_target = list("I heard something.") - say_got_target = list("Oh, good, I needed more range fodder.", "I'm going to enjoy this.", "I see you.", "Not quiet enough.") - say_threaten = list("Hoy, private property, fuck off.", "You're acting mighty bold for a bullet sponge.", "First and last warning; find somewhere else to be.", "I wouldn't do that if I were you.", "Back off or your field medic's getting a bonus.") - say_stand_down = list("Damn it, I was hoping you'd push your luck.", "What, that's it? Pussy.", "And don't come back.", "Good call. Don't do it again.", "Harrumph.", "That'll teach 'ya.") - say_escalate = list("Oh, I'm gonna enjoy this.", "I'm going to enjoy making you regret that.", "Last mistake you'll make.") - - -//Synth Horror Saylist - -/datum/say_list/cyber_horror - speak = list("H@!#$$P M@!$#", - "GHAA!@@#", - "KR@!!N", - "K!@@##L!@@ %!@#E", - "G@#!$ H@!#%", - "H!@%%@ @!E") - emote_hear = list("emits", "groans", "wails", "pleads") - emote_see = list ("stares unblinkingly.", "jitters and twitches.", "emits a synthetic scream.", "rapidly twitches.", "convulses.", "twitches uncontrollably.", "goes stock still.") - say_threaten = list ("FR@#DOM","EN@ T#I$-$","N0$ M^> B@!#") - say_got_target = list("I *#@ Y@%","!E@#$P","F#RR @I","D0@#$ ##OK %","IT $##TS") - - -// This one's pretty dumb, but pirates are dumb anyways. -/datum/say_list/pirate - speak = list("Yarr!", - "Yohoho and a bottle of rum...", - "Getting tried of hardtack.", - "What do you do with a drunken sailor...", - "One day We'll get that big score.", - "They ain't catching this pirate no-sir-ree") - - say_understood = list("Alright, matey.") - say_cannot = list("No, matey.") - say_maybe_target = list("Eh?", "Who goes there?") - say_got_target = list("Yarrrr!", "Just drop your loot and run") - say_threaten = list("You best leave, this booty is mine.", "No plank to walk on, just walk away.") - say_stand_down = list("Good.", "That's right run you lilly livers.") - say_escalate = list("Yarr! The booty is mine!", "Going to gut you landlubber.") - - -/datum/say_list/possessed - speak = list("Where am I?", - "Why am I here?", - "Where did everyone go?") - - emote_hear = list("lets out a mournful cry.", "can be heard sobbing.", "groans out in pain.") - emote_see = list("kneels down for a moment, picking something up before casting it away.","stands as still as a statue.", "looks to be doing some kind of work.") - - say_maybe_target = list("Is there someone there?", "Who's there?") - say_got_target = list("You! You help people!", "Can you help me?", "I'm lost!") - say_threaten = list("Help me!", "Please help!", "Hey, who turned out the lights?", "Allonsy!", "Geronimo!") - say_stand_down = list("Please. Anyone. Help!", "Where is everyone?", "Where am I?") - say_escalate = list("Help!", "I'm sorry!", "I can't stop!", "I don't want to do this!", "I don't want to go!") diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index f03be08770..b287d0c720 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -33,6 +33,8 @@ var/list/mutagenic_reagents // Reagents considered uniquely 'mutagenic' by a plant. var/list/toxic_reagents // Reagents considered uniquely 'toxic' by a plant. + var/ai_mob_product = 0 //This variable determines whether or not a mob product is meant to be ai-controlled. If set to 0, mob products die without a player to control them. + /datum/seed/New() set_trait(TRAIT_IMMUTABLE, 0) // If set, plant will never mutate. If -1, plant is highly mutable. diff --git a/code/modules/hydroponics/seed_datums_ch.dm b/code/modules/hydroponics/seed_datums_ch.dm index b88f9078fb..f35aa2ed4f 100644 --- a/code/modules/hydroponics/seed_datums_ch.dm +++ b/code/modules/hydroponics/seed_datums_ch.dm @@ -1,7 +1,3 @@ -//Variables to make certain things work. Consider sending upstream. -/datum/seed - var/ai_mob_product = 0 //This variable determines whether or not a mob product is meant to be ai-controlled. If set to 0, mob products die without a player to control them. - //////CHOMP PLANTS////// /datum/seed/soybean/sapbean @@ -137,79 +133,6 @@ set_trait(TRAIT_PRODUCTION,7) set_trait(TRAIT_YIELD,3) -// Tea plants/variants. -/datum/seed/tea - name = PLANT_TEA - seed_name = PLANT_TEA - display_name = "tea plant" - chems = list(REAGENT_ID_TEAMUSH = list(3,10)) - mutants = null - kitchen_tag = PLANT_TEA - -/datum/seed/tea/New() - ..() - set_trait(TRAIT_HARVEST_REPEAT,1) - set_trait(TRAIT_MATURATION,5) - set_trait(TRAIT_PRODUCTION,5) - set_trait(TRAIT_YIELD,6) - set_trait(TRAIT_POTENCY,20) - set_trait(TRAIT_PRODUCT_ICON,"tea") - set_trait(TRAIT_PRODUCT_COLOUR,"#b7e496") - set_trait(TRAIT_PLANT_COLOUR,"#b7e496") - set_trait(TRAIT_PLANT_ICON,"bush4") - set_trait(TRAIT_IDEAL_HEAT, 298) - set_trait(TRAIT_IDEAL_LIGHT, 7) - set_trait(TRAIT_WATER_CONSUMPTION, 6) - set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25) - -/datum/seed/pitcher_plant //Pitcher plant - name = PLANT_PITCHERPLANT - seed_name = PLANT_PITCHERPLANT - seed_noun = "pits" - display_name = "pitcher shoots" - can_self_harvest = 1 - apply_color_to_mob = FALSE - has_mob_product = /mob/living/simple_mob/vore/pitcher_plant - ai_mob_product = 1 - -/datum/seed/pitcher_plant/New() //No custom icons yet. No spread trait yet even though pitcher fruit can be planted outside of a tray as I've not tied that to hydroponics code. - ..() - set_trait(TRAIT_IMMUTABLE,1) - set_trait(TRAIT_CARNIVOROUS,1) - set_trait(TRAIT_MATURATION,8) - set_trait(TRAIT_PRODUCTION,6) - set_trait(TRAIT_WATER_CONSUMPTION,6) - set_trait(TRAIT_YIELD,1) - set_trait(TRAIT_POTENCY,10) - set_trait(TRAIT_PRODUCT_ICON,"corn") - set_trait(TRAIT_PRODUCT_COLOUR,"#a839a2") - set_trait(TRAIT_PLANT_COLOUR,"#5b6f43") - set_trait(TRAIT_PLANT_ICON,"ambrosia") - -/datum/seed/hardlightseed //WIP: havent ported the mob and such yet, best someone more keen on these mobs does it - Jack - name = PLANT_NULLHARDLIGHT - seed_name = "Biomechanical Hardlight generator seed" - display_name = "Biomechanical Hardlight stem" - mutants = null - can_self_harvest = 1 - has_mob_product = /mob/living/simple_mob/animal/synx/ai/pet/holo - ai_mob_product = 1 - -/datum/seed/hardlightseed/New() - ..() - set_trait(TRAIT_IMMUTABLE,1) //Normal genetics wont be able to do much with the mechanical parts, its more a machine than a real plant - set_trait(TRAIT_MATURATION,1) - set_trait(TRAIT_PRODUCTION,1) - set_trait(TRAIT_YIELD,1) - set_trait(TRAIT_POTENCY,1) - set_trait(TRAIT_PRODUCT_ICON,"alien4") - set_trait(TRAIT_PRODUCT_COLOUR,"#00FFFF") - set_trait(TRAIT_PLANT_COLOUR,"#00FFFF") - set_trait(TRAIT_PLANT_ICON,"alien4") //spooky pods - set_trait(TRAIT_IDEAL_HEAT, 283) - set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0) - set_trait(TRAIT_WATER_CONSUMPTION, 0) - /datum/seed/cinnamon //WIP - I have no idea what I'm doing with growables in code right now. name = PLANT_CINNAMON seed_name = PLANT_CINNAMON diff --git a/code/modules/hydroponics/seed_datums_vr.dm b/code/modules/hydroponics/seed_datums_vr.dm index a6b50a0308..b493915c66 100644 --- a/code/modules/hydroponics/seed_datums_vr.dm +++ b/code/modules/hydroponics/seed_datums_vr.dm @@ -42,3 +42,76 @@ /datum/seed/gnomes harvest_sound = 'sound/items/hooh.ogg' + +/datum/seed/pitcher_plant //Pitcher plant + name = PLANT_PITCHERPLANT + seed_name = PLANT_PITCHERPLANT + seed_noun = "pits" + display_name = "pitcher shoots" + can_self_harvest = 1 + apply_color_to_mob = FALSE + has_mob_product = /mob/living/simple_mob/vore/pitcher_plant + ai_mob_product = 1 + +/datum/seed/pitcher_plant/New() //No custom icons yet. No spread trait yet even though pitcher fruit can be planted outside of a tray as I've not tied that to hydroponics code. + ..() + set_trait(TRAIT_IMMUTABLE,1) + set_trait(TRAIT_CARNIVOROUS,1) + set_trait(TRAIT_MATURATION,8) + set_trait(TRAIT_PRODUCTION,6) + set_trait(TRAIT_WATER_CONSUMPTION,6) + set_trait(TRAIT_YIELD,1) + set_trait(TRAIT_POTENCY,10) + set_trait(TRAIT_PRODUCT_ICON,"corn") + set_trait(TRAIT_PRODUCT_COLOUR,"#a839a2") + set_trait(TRAIT_PLANT_COLOUR,"#5b6f43") + set_trait(TRAIT_PLANT_ICON,"ambrosia") + +// Tea plants/variants. +/datum/seed/tea + name = PLANT_TEA + seed_name = PLANT_TEA + display_name = "tea plant" + chems = list(REAGENT_ID_TEAMUSH = list(3,10)) + mutants = null + kitchen_tag = PLANT_TEA + +/datum/seed/tea/New() + ..() + set_trait(TRAIT_HARVEST_REPEAT,1) + set_trait(TRAIT_MATURATION,5) + set_trait(TRAIT_PRODUCTION,5) + set_trait(TRAIT_YIELD,6) + set_trait(TRAIT_POTENCY,20) + set_trait(TRAIT_PRODUCT_ICON,"tea") + set_trait(TRAIT_PRODUCT_COLOUR,"#b7e496") + set_trait(TRAIT_PLANT_COLOUR,"#b7e496") + set_trait(TRAIT_PLANT_ICON,"bush4") + set_trait(TRAIT_IDEAL_HEAT, 298) + set_trait(TRAIT_IDEAL_LIGHT, 7) + set_trait(TRAIT_WATER_CONSUMPTION, 6) + set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25) + +/datum/seed/hardlightseed //WIP: havent ported the mob and such yet, best someone more keen on these mobs does it - Jack + name = PLANT_NULLHARDLIGHT + seed_name = "Biomechanical Hardlight generator seed" + display_name = "Biomechanical Hardlight stem" + mutants = null + can_self_harvest = 1 + has_mob_product = /mob/living/simple_mob/animal/synx/ai/pet/holo + ai_mob_product = 1 + +/datum/seed/hardlightseed/New() + ..() + set_trait(TRAIT_IMMUTABLE,1) //Normal genetics wont be able to do much with the mechanical parts, its more a machine than a real plant + set_trait(TRAIT_MATURATION,1) + set_trait(TRAIT_PRODUCTION,1) + set_trait(TRAIT_YIELD,1) + set_trait(TRAIT_POTENCY,1) + set_trait(TRAIT_PRODUCT_ICON,"alien4") + set_trait(TRAIT_PRODUCT_COLOUR,"#00FFFF") + set_trait(TRAIT_PLANT_COLOUR,"#00FFFF") + set_trait(TRAIT_PLANT_ICON,"alien4") //spooky pods + set_trait(TRAIT_IDEAL_HEAT, 283) + set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0) + set_trait(TRAIT_WATER_CONSUMPTION, 0) diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm index 16b06d203f..63c9f096ba 100644 --- a/code/modules/hydroponics/seed_mobs.dm +++ b/code/modules/hydroponics/seed_mobs.dm @@ -1,7 +1,7 @@ // The following procs are used to grab players for mobs produced by a seed (mostly for dionaea). /datum/seed/proc/handle_living_product(var/mob/living/host) - if(!host || !istype(host) || ai_mob_product) return //CHOMPedit: ai_mob_product var to allow ai mobs to spawn from plants. + if(!host || !istype(host) || ai_mob_product) return if(apply_color_to_mob) host.color = traits[TRAIT_PRODUCT_COLOUR] diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index f16fb1db03..9a9525b67c 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -363,3 +363,9 @@ GLOBAL_LIST_BOILERPLATE(all_seed_packs, /obj/item/seeds) /obj/item/seeds/megashroom seed_type = PLANT_MEGAM + +/obj/item/seeds/teaseed + seed_type = PLANT_TEA + +/obj/item/seeds/pitcherseed + seed_type = PLANT_PITCHERPLANT diff --git a/code/modules/hydroponics/seed_packets_ch.dm b/code/modules/hydroponics/seed_packets_ch.dm index 315079ee19..5f0fff2c13 100644 --- a/code/modules/hydroponics/seed_packets_ch.dm +++ b/code/modules/hydroponics/seed_packets_ch.dm @@ -1,10 +1,2 @@ - -/obj/item/seeds/teaseed - seed_type = PLANT_TEA - - /obj/item/seeds/cinnamon seed_type = PLANT_CINNAMON - -/obj/item/seeds/pitcherseed - seed_type = PLANT_PITCHERPLANT diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index d6f6d36a3e..94c56865ee 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -1,4 +1,4 @@ -#define AGE_MOD_MAX 10 //CHOMPedit: Define for age_mod sanity check as a define to allow for easy tweaking. +#define AGE_MOD_MAX 10 // Define for age_mod sanity check as a define to allow for easy tweaking. /obj/machinery/portable_atmospherics/hydroponics name = "hydroponics tray" @@ -32,7 +32,7 @@ var/toxins = 0 // Toxicity in the tray? var/mutation_level = 0 // When it hits 100, the plant mutates. var/tray_light = 1 // Supplied lighting. - var/age_mod = 0 //CHOMPedit: Variable for chems which speed up plant growth. On average, every 3 age mod reduces growing time by 2.5 minutes. + var/age_mod = 0 // Variable for chems which speed up plant growth. On average, every 3 age mod reduces growing time by 2.5 minutes. // Mechanical concerns. var/health = 0 // Plant health. @@ -136,11 +136,9 @@ REAGENT_ID_MUTAGEN = 15 ) - //CHOMPedit: Reagents which double plant growth speed. var/static/list/age_reagents = list( REAGENT_ID_PITCHERNECTAR = 1 ) - //CHOMPedit end /obj/machinery/portable_atmospherics/hydroponics/AltClick(var/mob/living/user) if(!istype(user)) @@ -317,10 +315,8 @@ else if(toxic_reagents[R.id]) toxins += toxic_reagents[R.id] * reagent_total - //CHOMPedit: Agents which speed up plant growth if(age_reagents[R.id]) age_mod += age_reagents[R.id] * reagent_total - //CHOMPedit end //Handle some general level adjustments. These values are independent of plants existing. if(weedkiller_reagents[R.id]) @@ -373,7 +369,7 @@ age = 0 sampled = 0 mutation_mod = 0 - age_mod = 0 //CHOMPedit + age_mod = 0 check_health() return @@ -392,7 +388,7 @@ age = 0 yield_mod = 0 mutation_mod = 0 - age_mod = 0 //CHOMPedit + age_mod = 0 to_chat(user, span_filter_notice("You remove the dead plant.")) lastproduce = 0 @@ -412,7 +408,7 @@ dead = 0 age = 0 - age_mod = 0 //CHOMPedit + age_mod = 0 health = seed.get_trait(TRAIT_ENDURANCE) lastcycle = world.time harvest = 0 @@ -489,7 +485,7 @@ pestlevel = max(0,min(pestlevel,10)) weedlevel = max(0,min(weedlevel,10)) toxins = max(0,min(toxins,10)) - age_mod = max(0,min(age_mod,AGE_MOD_MAX)) //CHOMPedit: age_mod sanity check + age_mod = max(0,min(age_mod,AGE_MOD_MAX)) // age_mod sanity check /obj/machinery/portable_atmospherics/hydroponics/proc/mutate_species() @@ -726,4 +722,4 @@ to_chat(user, span_filter_notice("You [closed_system ? "close" : "open"] the tray's lid.")) update_icon() -#undef AGE_MOD_MAX //CHOMPedit +#undef AGE_MOD_MAX diff --git a/code/modules/hydroponics/trays/tray_process.dm b/code/modules/hydroponics/trays/tray_process.dm index 0a7460e0dc..58abd49d79 100644 --- a/code/modules/hydroponics/trays/tray_process.dm +++ b/code/modules/hydroponics/trays/tray_process.dm @@ -38,11 +38,11 @@ return // Advance plant age. - if(prob(30)) //CHOMPedit start: I have to push the age increase down for a line for this to work with the compiler. + if(prob(30)) age += 1 * HYDRO_SPEED_MULTIPLIER if(age_mod >= 1) //Age reagents double the speed of plant growth in sufficient quantities age += 1 * HYDRO_SPEED_MULTIPLIER - age_mod -= 1 //CHOMPedit end + age_mod -= 1 //Highly mutable plants have a chance of mutating every tick. if(seed.get_trait(TRAIT_IMMUTABLE) == -1) diff --git a/code/modules/mob/dead/corpse.dm b/code/modules/mob/dead/corpse.dm index d20691c89a..9084719d97 100644 --- a/code/modules/mob/dead/corpse.dm +++ b/code/modules/mob/dead/corpse.dm @@ -35,10 +35,10 @@ /// Color is optional, each position after the name is a color channel from 1 to n. var/list/ear_secondary_type var/list/wing_type = null - var/hair = null // CHOMPAdd + var/hair = null var/corpsesynthtype = 0 // 0 for organic, 1 for drone, 2 for posibrain var/corpsesynthbrand = "Unbranded" - var/corpsesensormode = 0 //CHOMPAdd - For setting the suit sensors of a corpse. Default to 0 so we don't annoy medbay. + var/corpsesensormode = 0 delete_me = TRUE /obj/effect/landmark/mobcorpse/Initialize(mapload) @@ -92,11 +92,9 @@ M.g_ears3 = color_rgb_list[2] M.b_ears3 = color_rgb_list[3] M.update_hair() - //CHOMPAdd Start if(hair) M.h_style = hair M.update_hair() - //CHOMPAdd End // handle secondary ears if(length(ear_secondary_type) && (ear_secondary_type[1] in GLOB.ear_styles_list)) M.ear_secondary_style = GLOB.ear_styles_list[ear_secondary_type[1]] @@ -124,10 +122,8 @@ M.update_wing_showing() M.real_name = generateCorpseName() M.set_stat(DEAD) //Kills the new mob - //CHOMPAdd: Corpses drop bones when melted and are easier to eat M.digest_leave_remains = TRUE M.can_be_drop_prey = TRUE - //CHOMPAdd End if(corpsesynthtype > 0) if(!corpsesynthbrand) corpsesynthbrand = "Unbranded" @@ -139,8 +135,8 @@ O.robotize(corpsesynthbrand) if(src.corpseuniform) M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform) - if(M.w_uniform) //CHOMPEdit - M.w_uniform?:sensor_mode = corpsesensormode //CHOMPEdit + if(M.w_uniform) + M.w_uniform?:sensor_mode = corpsesensormode if(src.corpsesuit) M.equip_to_slot_or_del(new src.corpsesuit(M), slot_wear_suit) if(src.corpseshoes) diff --git a/code/modules/mob/dead/corpse_ch.dm b/code/modules/mob/dead/corpse_vox.dm similarity index 100% rename from code/modules/mob/dead/corpse_ch.dm rename to code/modules/mob/dead/corpse_vox.dm diff --git a/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm index e232da3e22..614bef32ee 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm @@ -405,7 +405,7 @@ "rat" = image(icon = 'icons/mob/species/protean/protean64x32.dmi', icon_state = "rat", pixel_x = -16), "lizard" = image(icon = 'icons/mob/species/protean/protean64x32.dmi', icon_state = "lizard", pixel_x = -16), "wolf" = image(icon = 'icons/mob/species/protean/protean64x32.dmi', icon_state = "wolf", pixel_x = -16), - //"drake" = image(icon = 'modular_chomp/icons/mob/species/protean/protean64x64.dmi', icon_state = "drake", pixel_x = -16), + //"drake" = image(icon = 'icons/mob/species/protean/protean64x64.dmi', icon_state = "drake", pixel_x = -16), "teppi" = image(icon = 'icons/mob/species/protean/protean64x64.dmi', icon_state = "teppi", pixel_x = -16), "panther" = image(icon = 'icons/mob/species/protean/protean64x64.dmi', icon_state = "panther", pixel_x = -16), "robodrgn" = image(icon = 'icons/mob/species/protean/protean128x64.dmi', icon_state = "robodrgn", pixel_x = -48), diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities.dm index 64b6f1de6e..cd488c8fb3 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities.dm @@ -1184,3 +1184,184 @@ if("eyes") ourmsg += "on the eyes!" visible_message(span_warning(ourmsg)) + +//succuby bite is back baby +/mob/living/proc/succubus_bite() + set name = "Inject Prey" + set desc = "Bite prey and inject them with various toxins." + set category = "Abilities.Succubus" + + if(last_special > world.time) + return + + if(!ishuman(src)) + return //If you're not a human you don't have permission to do this. + + var/mob/living/carbon/human/C = src + + var/obj/item/grab/G = src.get_active_hand() + + if(!istype(G)) + to_chat(C, span_warning("You must be grabbing a creature in your active hand to bite them.")) + return + + var/mob/living/carbon/human/T = G.affecting + + if(!istype(T) || T.isSynthetic()) + to_chat(src, span_warning("\The [T] is not able to be bitten.")) + return + + if(G.state != GRAB_NECK) + to_chat(C, span_warning("You must have a tighter grip to bite this creature.")) + return + + var/choice = tgui_input_list(src, "What do you wish to inject?", "Reagent", list(REAGENT_APHRODISIAC, "Numbing", "Paralyzing")) + + last_special = world.time + 600 + + if(!choice) + return + + src.visible_message(span_bolddanger("[src] moves their head next to [T]'s neck, seemingly looking for something!")) + + if(do_after(src, 300, T)) //Thrirty seconds. + if(choice == REAGENT_APHRODISIAC) + src.show_message(span_warning("You sink your fangs into [T] and inject your aphrodisiac!")) + src.visible_message(span_red("[src] sinks their fangs into [T]!")) + T.bloodstr.add_reagent(REAGENT_ID_APHRODIAC_FLUID,100) + return 0 + else if(choice == "Numbing") + src.show_message(span_warning("You sink your fangs into [T] and inject your poison!")) + src.visible_message(span_red("[src] sinks their fangs into [T]!")) + T.bloodstr.add_reagent(REAGENT_ID_NUMBING_FLUID,20) //Poisons should work when more units are injected + else if(choice == "Paralyzing") + src.show_message(span_warning("You sink your fangs into [T] and inject your poison!")) + src.visible_message(span_red("[src] sinks their fangs into [T]!")) + T.bloodstr.add_reagent(REAGENT_ID_PARALYZE_FLUID,20) //Poisons should work when more units are injected + else + return //Should never happen + +/datum/reagent/succubi_aphrodisiac + name = REAGENT_APHRODISIAC + id = REAGENT_ID_APHRODIAC_FLUID + description = "A unknown liquid, it smells sweet" + metabolism = REM * 0.8 + color = "#8A0829" + scannable = 0 + wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MATSCI + +/datum/reagent/succubi_aphrodisiac/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(prob(3)) + M.show_message(span_warning("You feel funny, and fall in love with the person in front of you")) + M.say(pick("!blushes", "!moans", "!giggles", "!turns visibly red")) //using mob say so we dont have to define this dumb one time use emote that equates to just blushing -shark + //M.charmed() //TODO + return + +/datum/reagent/succubi_numbing //Using numbing_enzyme instead. + name = REAGENT_NUMBING_FLUID + id = REAGENT_ID_NUMBING_FLUID + description = "A unknown liquid, it doesn't smell" + metabolism = REM * 0.5 + color = "#41029B" + scannable = 0 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MATSCI + +/datum/reagent/succubi_numbing/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + + + M.eye_blurry = max(M.eye_blurry, 10) + M.Weaken(2) + M.drowsyness = max(M.drowsyness, 20) + if(prob(7)) + M.show_message(span_warning("You start to feel weakened, your body seems heavy.")) + return + +/datum/reagent/succubi_paralize + name = REAGENT_PARALYZE_FLUID + id = REAGENT_ID_PARALYZE_FLUID + description = "A unknown liquid, it doesn't smell" + metabolism= REM * 0.5 + color = "#41029B" + scannable = 0 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MATSCI + +/datum/reagent/succubi_paralize/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) //will first keep it like that. lets see what it changes. if nothing, than I will rework the effect again + + M.Weaken(20) + M.eye_blurry = max(M.eye_blurry, 10) + if(prob(10)) + M.show_message(span_warning("You lose sensation of your body.")) + return + + +//egglaying +var/eggs = 0 + + +/mob/living/proc/mobegglaying() + set name = "Egg laying" + set desc = "you can lay Eggs" + set category = "Abilities.General" + + var/mob/living/carbon/human/C = src + + if(last_special > world.time) + return + + var/choice = tgui_input_list(src, "What do you want to do?", "Egg Option", list("Make a Egg", "lay your Eggs")) + last_special = world.time + 600 + + if(!choice) + return + + if(do_after(src, 300)) //Thrirty seconds. + if(choice == "Make a Egg") + src.show_message(span_warning("You feel your belly bulging a bit, you made an egg!")) + C.nutrition -=150 + eggs += 1 + return 0 + else if(choice == "Make a Egg" && eggs > 5) + src.show_message(span_warning("Your Belly is full of Eggs you cant have more!!")) + return 0 + else if(choice == "lay your Eggs" && eggs > 0) + src.visible_message(span_infoplain(span_white("[src] freezes and vissibly tries to squat down"))) + + while(eggs > 0) + src.show_message(span_warning("You lay a egg!")) + eggs-- + var/obj/item/reagent_containers/food/snacks/egg/E = new(get_turf(src)) + E.pixel_x = rand(-6,6) + E.pixel_y = rand(-6,6) + return + else + src.visible_message(span_warning("you dont have any eggs!")) + return //Should never happen + +/mob/living/proc/insect_sting() + set name = "Insect Sting" + set desc = "Sting a target and inject a small amount of toxin" + set category = "Abilities.General" + + if(last_special > world.time) + return + + var/list/victims = list() + for(var/mob/living/carbon/C in oview(1)) + victims += C + var/mob/living/carbon/T = tgui_input_list(src, "Who will we sting?", "Target", victims) + + if(!T) + return + if(T.isSynthetic()) + to_chat(src, span_notice("We are unable to pierce the outer shell of [T].")) + return + + to_chat(src, span_notice("You jab your stinger into [T].")) + to_chat(T, span_danger("You feel a stabbing pain as you are stung!")) + src.visible_message(span_infoplain(span_red("[src] sinks their stinger into [T]!"))) + T.bloodstr.add_reagent(REAGENT_ID_CONDENSEDCAPSAICINV,3) + last_special = world.time + 50 // Many little jabs instead of one big one diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_ch.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_ch.dm deleted file mode 100644 index 0de24a5a57..0000000000 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_ch.dm +++ /dev/null @@ -1,204 +0,0 @@ -//succuby bite is back baby -/mob/living/proc/succubus_bite() - set name = "Inject Prey" - set desc = "Bite prey and inject them with various toxins." - set category = "Abilities.Succubus" - - if(last_special > world.time) - return - - if(!ishuman(src)) - return //If you're not a human you don't have permission to do this. - - var/mob/living/carbon/human/C = src - - var/obj/item/grab/G = src.get_active_hand() - - if(!istype(G)) - to_chat(C, span_warning("You must be grabbing a creature in your active hand to bite them.")) - return - - var/mob/living/carbon/human/T = G.affecting - - if(!istype(T) || T.isSynthetic()) - to_chat(src, span_warning("\The [T] is not able to be bitten.")) - return - - if(G.state != GRAB_NECK) - to_chat(C, span_warning("You must have a tighter grip to bite this creature.")) - return - - var/choice = tgui_input_list(src, "What do you wish to inject?", "Reagent", list(REAGENT_APHRODISIAC, "Numbing", "Paralyzing")) - - last_special = world.time + 600 - - if(!choice) - return - - src.visible_message(span_bolddanger("[src] moves their head next to [T]'s neck, seemingly looking for something!")) - - if(do_after(src, 300, T)) //Thrirty seconds. - if(choice == REAGENT_APHRODISIAC) - src.show_message(span_warning("You sink your fangs into [T] and inject your aphrodisiac!")) - src.visible_message(span_red("[src] sinks their fangs into [T]!")) - T.bloodstr.add_reagent(REAGENT_ID_APHRODIAC_FLUID,100) - return 0 - else if(choice == "Numbing") - src.show_message(span_warning("You sink your fangs into [T] and inject your poison!")) - src.visible_message(span_red("[src] sinks their fangs into [T]!")) - T.bloodstr.add_reagent(REAGENT_ID_NUMBING_FLUID,20) //Poisons should work when more units are injected - else if(choice == "Paralyzing") - src.show_message(span_warning("You sink your fangs into [T] and inject your poison!")) - src.visible_message(span_red("[src] sinks their fangs into [T]!")) - T.bloodstr.add_reagent(REAGENT_ID_PARALYZE_FLUID,20) //Poisons should work when more units are injected - else - return //Should never happen - -/* //will maybe add something one day -mob/living/carbon/proc/charmed() //TODO - charmed = 1 - spawn(0) - for(var/i = 1,i > 0, i--) - src << "" + span_italics("... [pick(charmed)] ...") + "" - charmed = 0 -*/ - -/datum/reagent/succubi_aphrodisiac - name = REAGENT_APHRODISIAC - id = REAGENT_ID_APHRODIAC_FLUID - description = "A unknown liquid, it smells sweet" - metabolism = REM * 0.8 - color = "#8A0829" - scannable = 0 - wiki_flag = WIKI_SPOILER - supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED - industrial_use = REFINERYEXPORT_REASON_MATSCI - -/datum/reagent/succubi_aphrodisiac/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(prob(3)) - M.show_message(span_warning("You feel funny, and fall in love with the person in front of you")) - M.say(pick("!blushes", "!moans", "!giggles", "!turns visibly red")) //using mob say so we dont have to define this dumb one time use emote that equates to just blushing -shark - //M.charmed() //TODO - return - -/datum/reagent/succubi_numbing //Using numbing_enzyme instead. - name = REAGENT_NUMBING_FLUID - id = REAGENT_ID_NUMBING_FLUID - description = "A unknown liquid, it doesn't smell" - metabolism = REM * 0.5 - color = "#41029B" - scannable = 0 - supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED - industrial_use = REFINERYEXPORT_REASON_MATSCI - -/datum/reagent/succubi_numbing/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - - - M.eye_blurry = max(M.eye_blurry, 10) - M.Weaken(2) - M.drowsyness = max(M.drowsyness, 20) - if(prob(7)) - M.show_message(span_warning("You start to feel weakened, your body seems heavy.")) - return - -/datum/reagent/succubi_paralize - name = REAGENT_PARALYZE_FLUID - id = REAGENT_ID_PARALYZE_FLUID - description = "A unknown liquid, it doesn't smell" - metabolism= REM * 0.5 - color = "#41029B" - scannable = 0 - supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED - industrial_use = REFINERYEXPORT_REASON_MATSCI - -/datum/reagent/succubi_paralize/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) //will first keep it like that. lets see what it changes. if nothing, than I will rework the effect again - - M.Weaken(20) - M.eye_blurry = max(M.eye_blurry, 10) - if(prob(10)) - M.show_message(span_warning("You lose sensation of your body.")) - return - - -//egglaying -var/eggs = 0 - - -/mob/living/proc/mobegglaying() - set name = "Egg laying" - set desc = "you can lay Eggs" - set category = "Abilities.General" - - var/mob/living/carbon/human/C = src - - if(last_special > world.time) - return - - var/choice = tgui_input_list(src, "What do you want to do?", "Egg Option", list("Make a Egg", "lay your Eggs")) - last_special = world.time + 600 - - if(!choice) - return - - if(do_after(src, 300)) //Thrirty seconds. - if(choice == "Make a Egg") - src.show_message(span_warning("You feel your belly bulging a bit, you made an egg!")) - C.nutrition -=150 - eggs += 1 - return 0 - else if(choice == "Make a Egg" && eggs > 5) - src.show_message(span_warning("Your Belly is full of Eggs you cant have more!!")) - return 0 - else if(choice == "lay your Eggs" && eggs > 0) - src.visible_message(span_infoplain(span_white("[src] freezes and vissibly tries to squat down"))) - - while(eggs > 0) - src.show_message(span_warning("You lay a egg!")) - eggs-- - var/obj/item/reagent_containers/food/snacks/egg/E = new(get_turf(src)) - E.pixel_x = rand(-6,6) - E.pixel_y = rand(-6,6) - return - else - src.visible_message(span_warning("you dont have any eggs!")) - return //Should never happen - -/* - if(layeggs == 1) - src.visible_message(span_infoplain(span_white(span_bold("[src] freezes and vissibly tries to squat down")))) - - while(eggs > 0) - src.show_message(span_warning("You lay you egg!")) - eggs-- - var/obj/item/reagent_containers/food/snacks/egg/E = new(get_turf(src)) - E.pixel_x = rand(-6,6) - E.pixel_y = rand(-6,6) - layeggs-- - - return -*/ - -/mob/living/proc/insect_sting() - set name = "Insect Sting" - set desc = "Sting a target and inject a small amount of toxin" - set category = "Abilities.General" - - if(last_special > world.time) - return - - var/list/victims = list() - for(var/mob/living/carbon/C in oview(1)) - victims += C - var/mob/living/carbon/T = tgui_input_list(src, "Who will we sting?", "Target", victims) - - if(!T) - return - if(T.isSynthetic()) - to_chat(src, span_notice("We are unable to pierce the outer shell of [T].")) - return - - to_chat(src, span_notice("You jab your stinger into [T].")) - to_chat(T, span_danger("You feel a stabbing pain as you are stung!")) - src.visible_message(span_infoplain(span_red("[src] sinks their stinger into [T]!"))) - T.bloodstr.add_reagent(REAGENT_ID_CONDENSEDCAPSAICINV,3) - last_special = world.time + 50 // Many little jabs instead of one big one diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm index 52ca7fc928..10501233a9 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm @@ -36,16 +36,16 @@ var/datum/matter_synth/glass = null var/datum/matter_synth/wood = null var/datum/matter_synth/plastic = null - var/datum/matter_synth/water = null //CHOMPAdd readd water + var/datum/matter_synth/water = null var/digest_brute = 2 var/digest_burn = 3 var/digest_multiplier = 1 var/recycles = FALSE var/medsensor = TRUE //Does belly sprite come with patient ok/dead light? var/obj/item/healthanalyzer/med_analyzer = null - var/ore_storage = FALSE //CHOMPAdd - var/max_ore_storage = 500 //CHOMPAdd - var/current_capacity = 0 //CHOMPAdd + var/ore_storage = FALSE + var/max_ore_storage = 500 + var/current_capacity = 0 flags = NOBLUDGEON /obj/item/dogborg/sleeper/Initialize(mapload) @@ -277,7 +277,7 @@ dat += span_red(span_bold("Current load:") + " [length(contents)] / [max_item_count] objects.") + "
" dat += span_gray("([contents.Join(", ")])") + "

" - if(ore_storage) //CHOMPAdd + if(ore_storage) dat += "Current ore capacity: [current_capacity] / [max_ore_storage].
" if(delivery && length(contents)) @@ -559,7 +559,7 @@ if(SSair.current_cycle%3==1 && length(touchable_items)) //Burn all the mobs or add them to the exclusion list - var/volume = 0 //CHOMPAdd + var/volume = 0 for(var/mob/living/T in (touchable_items)) touchable_items -= T //Exclude mobs from loose item picking. if(SEND_SIGNAL(T, COMSIG_CHECK_FOR_GODMODE) & COMSIG_GODMODE_CANCEL) @@ -575,10 +575,8 @@ var/actual_burn = T.getFireLoss() - old_burn var/damage_gain = actual_brute + actual_burn hound.adjust_nutrition(2.5 * damage_gain) //drain(-25 * damage_gain) //25*total loss as with voreorgan stats. - //CHOMPAdd Start if(water) water.add_charge(damage_gain) - //CHOMPAdd End if(T.stat == DEAD) if(ishuman(T)) log_admin("[key_name(hound)] has digested [key_name(T)] with a cyborg belly. ([hound ? "JMP" : "null"])") @@ -612,7 +610,6 @@ items_preserved |= brain else T.drop_from_inventory(I, src) - //CHOMPAdd Start if(ishuman(T)) var/mob/living/carbon/human/Prey = T volume = (Prey.bloodstr.total_volume + Prey.ingested.total_volume + Prey.touching.total_volume + Prey.weight) * Prey.size_multiplier @@ -622,7 +619,6 @@ volume = T.reagents.total_volume if(water) water.add_charge(volume) - //CHOMPAdd End if(T.ckey) GLOB.prey_digested_roundstat++ if(patient == T) @@ -638,19 +634,15 @@ //Handle the target being anything but a /mob/living var/obj/item/T = target if(istype(T)) - //CHOMPAdd Start if(T.reagents) volume = T.reagents.total_volume - //CHOMPAdd End var/is_trash = istype(T, /obj/item/trash) var/digested = T.digest_act(item_storage = src) if(!digested) items_preserved |= T else - //CHOMPAdd Start if(volume && water) water.add_charge(volume) - //CHOMPAdd End if(recycles && T.matter) for(var/material in T.matter) var/total_material = T.matter[material] diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_types.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_types.dm index 236b705a32..d5cd8c1319 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_types.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_types.dm @@ -43,7 +43,6 @@ recycles = FALSE */ -//CHOMPEdit Start /obj/item/dogborg/sleeper/compactor/supply //Miner borg belly name = "Supply Storage" desc = "A mounted survival unit with fuel processor, helpful with both deliveries and assisting injured miners." @@ -94,7 +93,6 @@ to_chat(user, span_notice("You empty the satchel into the box.")) return ..() -//CHOMPEdit End /obj/item/dogborg/sleeper/compactor/brewer name = "Brew Belly" @@ -113,7 +111,6 @@ max_item_count = 10 recycles = FALSE -// CHOMPAdd Start /obj/item/dogborg/sleeper/compactor/brewer/inject_chem(mob/user, chem) if(patient && patient.reagents) if((chem in injection_chems) + REAGENT_ID_INAPROVALINE) @@ -127,7 +124,6 @@ drain(100) //-100 charge per injection var/units = round(patient.reagents.get_reagent_amount(chem)) to_chat(hound, span_notice("Injecting [units] unit\s into occupant.")) //If they were immersed, the reagents wouldn't leave with them. -// CHOMPAdd End /obj/item/dogborg/sleeper/K9/ert name = "Emergency Storage" diff --git a/code/modules/mob/living/simple_mob/combat.dm b/code/modules/mob/living/simple_mob/combat.dm index ecbe241c55..f981b235e3 100644 --- a/code/modules/mob/living/simple_mob/combat.dm +++ b/code/modules/mob/living/simple_mob/combat.dm @@ -113,7 +113,6 @@ try_reload() return FALSE - //CHOMP Addition: This section here is special snowflake code for metroids only, or for whatever else in the future that you want to have move and shoot at the same time. Basically, this is a non-stupid version of the above intended for ranged vore mobs i.e. metroids. ranged_attack_delay is stupid because it sleeps the entire mob. This new ranged_cooldown_time is smarter in the sense that it is an internalized timer. Try not to confuse the names. if(ranged_cooldown_time) //If you have a non-zero number in a mob's variables, this pattern begins. if(ranged_cooldown <= world.time) //Further down, a timer keeps adding to the ranged_cooldown variable automatically. visible_message(span_danger(span_bold("\The [src]") + " fires at \the [A]!")) //Leave notice of shooting. @@ -121,7 +120,7 @@ if(casingtype) //If the mob is designated to leave casings... new casingtype(loc) //... leave the casing. ranged_cooldown = world.time + ranged_cooldown_time + ((injury_level / 2) SECONDS) //Special addition here. This is a timer. Keeping updating the time after shooting. Add that ranged cooldown time specified in the mob to the world time. - return TRUE //End these commands here. + return TRUE visible_message(span_danger(span_bold("\The [src]") + " fires at \the [A]!")) shoot(A) @@ -157,7 +156,6 @@ if(needs_reload) reload_count++ - // if(distance >= special_attack_min_range && distance <= special_attack_max_range) // return TRUE diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm index 7e94569dfd..d5d6bc8d1a 100644 --- a/code/modules/mob/living/simple_mob/defense.dm +++ b/code/modules/mob/living/simple_mob/defense.dm @@ -14,7 +14,7 @@ switch(L.a_intent) if(I_HELP) if(health > 0) - if(L.zone_sel.selecting == BP_GROIN) //CHOMPEdit + if(L.zone_sel.selecting == BP_GROIN) if(L.vore_bellyrub(src)) return L.visible_message(span_notice("\The [L] [response_help] \the [src].")) @@ -202,7 +202,7 @@ // Electricity /mob/living/simple_mob/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null) - var/zap = min((1-get_shock_protection()), siemens_coeff) //CHOMPEdit - for some reason simple mobs just never properly checked for shock resist? Whatever, take whichever is lower. + var/zap = min((1-get_shock_protection()), siemens_coeff) shock_damage *= zap if(shock_damage < 1) return 0 diff --git a/code/modules/mob/living/simple_mob/harvesting.dm b/code/modules/mob/living/simple_mob/harvesting.dm index 8fd390a585..6cbdc2cb7c 100644 --- a/code/modules/mob/living/simple_mob/harvesting.dm +++ b/code/modules/mob/living/simple_mob/harvesting.dm @@ -18,10 +18,10 @@ /mob/living/simple_mob/examine(mob/user) . = ..() if(stat != DEAD && user && harvest_tool && (get_dist(user, src) <= 3)) - . += span_notice("\The [src] can be [harvest_verb] with a [initial(harvest_tool.name)] every [harvest_cooldown / 600] minutes.") //CHOMPEdit Please do math better + . += span_notice("\The [src] can be [harvest_verb] with a [initial(harvest_tool.name)] every [harvest_cooldown / 600] minutes.") var/time_to_harvest = (harvest_recent + harvest_cooldown) - world.time if(time_to_harvest > 0) - . += span_notice("It can be [harvest_verb] in [(time_to_harvest)] second(s).") //CHOMPEdit This is as good as I can get for now, I intend to make it better later + . += span_notice("It can be [harvest_verb] in [(time_to_harvest)] second(s).") else . += span_notice("It can be [harvest_verb] now.") diff --git a/code/modules/mob/living/simple_mob/on_click.dm b/code/modules/mob/living/simple_mob/on_click.dm index 18de46df13..69e18211f2 100644 --- a/code/modules/mob/living/simple_mob/on_click.dm +++ b/code/modules/mob/living/simple_mob/on_click.dm @@ -17,9 +17,9 @@ if(isliving(A)) var/mob/living/L = A if(istype(L) && (!has_hands || !L.attempt_to_scoop(src))) - if(src.zone_sel.selecting == BP_GROIN) //CHOMPEdit - if(src.vore_bellyrub(A)) //ChompEDIT - return //ChompEDIT + if(src.zone_sel.selecting == BP_GROIN) + if(src.vore_bellyrub(A)) + return automatic_custom_emote(VISIBLE_MESSAGE,"[pick(friendly)] \the [A]!", check_stat = TRUE) if(istype(A,/obj/structure/micro_tunnel)) //Allows simplemobs to click on mouse holes, mice should be allowed to go in mouse holes, and other mobs var/obj/structure/micro_tunnel/t = A //should be allowed to drag the mice out of the mouse holes! diff --git a/code/modules/mob/living/simple_mob/simple_mob.dm b/code/modules/mob/living/simple_mob/simple_mob.dm index 485184b554..33319e0f1b 100644 --- a/code/modules/mob/living/simple_mob/simple_mob.dm +++ b/code/modules/mob/living/simple_mob/simple_mob.dm @@ -111,8 +111,10 @@ var/melee_attack_delay = 2 // If set, the mob will do a windup animation and can miss if the target moves out of the way. var/ranged_attack_delay = null var/special_attack_delay = null - var/ranged_cooldown = 0 //CHOMP Addition. This is part of a timer in combat.dm. - var/ranged_cooldown_time = 0 //CHOMP Addition: This variable can be thrown into mob variables in order to allow the mob to move AND shoot at the same time. The previous "ranged_attack_delay" is a dumb way of handling ranged attacks because it sleeps the entire mob - this one uses an internalized timer so it is slightly smarter. + var/ranged_cooldown = 0 + var/ranged_cooldown_time = 0 + var/picked_color = FALSE + var/picked_size = FALSE //Special attacks // var/special_attack_prob = 0 // The chance to ATTEMPT a special_attack_target(). If it fails, it will do a regular attack instead. @@ -205,10 +207,10 @@ if(has_eye_glow) add_eyes() - if(vore_active) //CHOMPSTATION edit: Moved here so the verb is useable before initialising vorgans. - add_verb(src,/mob/living/simple_mob/proc/animal_nom) //CHOMPEdit TGPanel - add_verb(src,/mob/living/proc/shred_limb) //CHOMPEdit TGPanel - add_verb(src,/mob/living/simple_mob/proc/nutrition_heal) //CHOMPEdit TGPanel //CHOMPSTATION edit + if(vore_active) // Moved here so the verb is useable before initialising vorgans. + add_verb(src,/mob/living/simple_mob/proc/animal_nom) + add_verb(src,/mob/living/proc/shred_limb) + add_verb(src,/mob/living/simple_mob/proc/nutrition_heal) if(organ_names) organ_names = GET_DECL(organ_names) @@ -241,12 +243,48 @@ //Client attached /mob/living/simple_mob/Login() . = ..() + add_verb(src,/mob/living/simple_mob/proc/pick_size) + add_verb(src,/mob/living/simple_mob/proc/pick_color) to_chat(src,span_boldnotice("You are \the [src].") + " [player_msg]") if(vore_active && !voremob_loaded) init_vore(TRUE) if(hasthermals) add_verb(src, /mob/living/simple_mob/proc/hunting_vision) //So that maint preds can see prey through walls, to make it easier to find them. + +/mob/living/simple_mob/proc/pick_size() + set name = "Pick Size" + set category = "Abilities.Settings" + + if(picked_size) + to_chat(src, span_notice("You have already picked a size! If you picked the wrong size, ask an admin to change your picked_size variable to 0.")) + return + if(!resizable) + to_chat(src, span_warning("You are immune to resizing!")) + return + + var/nagmessage = "Pick a size between [RESIZE_MINIMUM * 100] to [RESIZE_MAXIMUM * 100]%. (Only usable once!)" + var/new_size = tgui_input_number(src, nagmessage, "Pick a Size", size_multiplier*100, RESIZE_MAXIMUM * 100, RESIZE_MINIMUM * 100) + if(size_range_check(new_size)) + resize(new_size/100, uncapped = has_large_resize_bounds(), ignore_prefs = TRUE) + picked_size = TRUE + if(temporary_form) //resizing both our forms + var/mob/living/L = temporary_form + L.resize(new_size/100, uncapped = has_large_resize_bounds(), ignore_prefs = TRUE) + +/mob/living/simple_mob/proc/pick_color() + set name = "Pick Color" + set category = "Abilities.Settings" + set desc = "You can set your color!" + if(picked_color) + to_chat(src, span_notice("You have already picked a color! If you picked the wrong color, ask an admin to change your picked_color variable to 0.")) + return + var/newcolor = tgui_color_picker(usr, "Choose a color.", "", color) + if(newcolor) + color = newcolor + picked_color = TRUE + update_icon() + /mob/living/simple_mob/SelfMove(turf/n, direct, movetime) var/turf/old_turf = get_turf(src) var/old_dir = dir diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index 8b52c7a978..9eb7281d41 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -46,7 +46,7 @@ var/obj/item/radio/headset/mob_radio //Adminbus headset for simplemob shenanigans. does_spin = FALSE can_be_drop_pred = TRUE // Mobs are pred by default. - can_be_drop_prey = TRUE //CHOMP Add This also counts for spontaneous prey for telenoms and phase noms. + can_be_drop_prey = TRUE var/damage_threshold = 0 //For some mobs, they have a damage threshold required to deal damage to them. var/nom_mob = FALSE //If a mob is meant to be hostile for vore purposes but is otherwise not hostile, if true makes certain AI ignore the mob @@ -63,11 +63,11 @@ //For all those ID-having mobs /mob/living/simple_mob/GetIdCard() - if(get_active_hand()) //CHOMPAdd Start + if(get_active_hand()) var/obj/item/I = get_active_hand() var/id = I.GetID() if(id) - return id //CHOMPAdd End + return id if(myid) return myid @@ -144,7 +144,7 @@ return PounceTarget(L, pouncechance) // We're not attempting a pounce, if they're down or we can eat standing, do it as long as they're edible. Otherwise, hit normally. - if(will_eat(L) && (L.lying || vore_standing_too)) //CHOMPEdit + if(will_eat(L) && (L.lying || vore_standing_too)) return EatTarget(L) else return ..() @@ -229,6 +229,8 @@ add_verb(src, /mob/living/simple_mob/proc/animal_nom) add_verb(src, /mob/living/proc/shred_limb) add_verb(src, /mob/living/simple_mob/proc/nutrition_heal) + add_verb(src, /mob/living/proc/eat_trash) + add_verb(src, /mob/living/proc/toggle_trash_catching) if(LAZYLEN(vore_organs)) return @@ -279,10 +281,9 @@ "The churning walls slowly pulverize you into meaty nutrients.", "The stomach glorps and gurgles as it tries to work you into slop.") can_be_drop_pred = TRUE // Mobs will eat anyone that decides to drop/slip into them by default. -// B.belly_fullscreen = "yet_another_tumby" //Chompedit - Why are they even using this one, I do not understand. - B.belly_fullscreen = "a_tumby" //Chompedit - B.belly_fullscreen_color = "#823232" //Chompedit - B.belly_fullscreen_color2 = "#823232" //Chompedit + B.belly_fullscreen = "a_tumby" + B.belly_fullscreen_color = "#823232" + B.belly_fullscreen_color2 = "#823232" /mob/living/simple_mob/Bumped(var/atom/movable/AM, yes) if(tryBumpNom(AM)) @@ -400,7 +401,6 @@ visible_message(span_notice("[M] starts riding [name]!")) /mob/living/simple_mob/handle_message_mode(message_mode, message, verb, used_radios, speaking, alt_name) - //CHOMPEdit - This whole proc tbh if(message_mode) if(message_mode == "intercom") for(var/obj/item/radio/intercom/I in view(1, null)) @@ -474,5 +474,5 @@ var/armor_block = run_armor_check(T, "melee") var/armor_soak = get_armor_soak(T, "melee") T.apply_damage(20, HALLOSS,, armor_block, armor_soak) - if(prob(75)) //CHOMPEdit + if(prob(75)) T.apply_effect(3, WEAKEN, armor_block) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm index c99e55c436..d034b7d9c1 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm @@ -60,7 +60,6 @@ allow_mind_transfer = TRUE - //var/picked_color = FALSE //CHOMPEdit - now on simplemob. can_enter_vent_with = list( /obj/item/implant, @@ -121,7 +120,6 @@ B.name = "stomach" B.desc = "The hot slick gut of a catslug!! Copious slime smears over you as you’re packed away into the gloom and oppressive humidity of this churning gastric sac. The pressure around you is intense, the squashy flesh bends and forms to your figure, clinging to you insistently! There’s basically no free space at all as your ears are filled with the slick slide of flesh against flesh and the burbling of gastric juices glooping all around you. The thumping of a heart booms from somewhere nearby, making everything pulse in against you in time with it! This is it! You’ve been devoured by a catslug!!!" B.mode_flags = 40 -// B.belly_fullscreen = "yet_another_tumby" //Chompedit - Belly Fullscreen change B.digest_brute = 0.5 B.digest_burn = 0.5 B.digestchance = 10 @@ -1097,7 +1095,7 @@ //============================= //Suslug's below -/*CHOMP Remove START Removing among us meme +/* CHOMPRemove Start Removing among us meme /mob/living/simple_mob/vore/alienanimals/catslug/suslug name = "suslug" desc = "A noodley bodied creature wearing a colorful space suit. Suspicious..." @@ -1234,4 +1232,4 @@ /mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/light_yellow color = COLOR_WHEAT -CHOMP Remove END*/ +*/// CHOMPRemove End diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/jellyfish.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/jellyfish.dm index b2e0938000..fe7187fe32 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/jellyfish.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/jellyfish.dm @@ -78,7 +78,7 @@ GLOBAL_VAR_INIT(jellyfish_count, 0) vore_default_contamination_flavor = "Wet" vore_default_contamination_color = "grey" vore_default_item_mode = IM_DIGEST - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE var/reproduction_cooldown = 0 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/skeleton.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/skeleton.dm index 8108df5aeb..49ba3cfb66 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/skeleton.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/skeleton.dm @@ -75,7 +75,7 @@ vore_default_contamination_flavor = "Wet" vore_default_contamination_color = "grey" vore_default_item_mode = IM_DIGEST - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/vore/alienanimals/skeleton/alt icon_state = "altskeleton" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/space_mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/space_mouse.dm index 8d48265b02..d0cc3deff0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/space_mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/space_mouse.dm @@ -28,8 +28,8 @@ response_disarm = "pushes" response_harm = "punches" - has_langs = list(LANGUAGE_MOUSE)//CHOMPADD they're basically mice, why cant they speak it - universal_understand = 1 //CHOMPADD and mice can understand all languages too so.. why not dustjumpers too + has_langs = list(LANGUAGE_MOUSE) + universal_understand = 1 melee_damage_lower = 1 melee_damage_upper = 2 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spacewhale.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spacewhale.dm index e61057b396..8887631913 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spacewhale.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spacewhale.dm @@ -47,7 +47,7 @@ vore_default_contamination_flavor = "Wet" vore_default_contamination_color = "grey" vore_default_item_mode = IM_DIGEST - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /datum/say_list/spacewhale emote_see = list("ripples and flows", "flashes rhythmically","glows faintly","investigates something") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm index 753b350c42..1518d58066 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm @@ -87,7 +87,7 @@ reload_count = 0 reload_time = 7 SECONDS - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /datum/ai_holder/simple_mob/ranged/kiting/space_ghost diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm index b210c63295..4a4b845f8b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm @@ -381,7 +381,6 @@ edge_blending_priority = 4 initial_flooring = /decl/flooring/fur can_dig = FALSE - //turf_layers = list() CHOMP Removal var/tree_chance = 25 var/tree_color = null var/tree_type = /obj/structure/flora/tree/fur @@ -1530,15 +1529,14 @@ linked_mob.adjust_nutrition(how_much) H.mind?.vore_death = TRUE GLOB.prey_digested_roundstat++ - spawn(0) qdel(H) //glorp return - H.burn_skin(damage) //CHOMPEdit Start + H.burn_skin(damage) if(linked_mob) var/how_much = (damage * H.size_multiplier) * H.get_digestion_nutrition_modifier() * linked_mob.get_digestion_efficiency_modifier() if(!H.ckey) how_much = how_much / 10 //Braindead mobs are worth less - linked_mob.adjust_nutrition(how_much) //CHOMPEdit End + linked_mob.adjust_nutrition(how_much) else if (isliving(thing)) var/mob/living/L = thing if(!L) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/startreader.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/startreader.dm index 227d5de110..6b1f47d51f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/startreader.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/startreader.dm @@ -86,7 +86,7 @@ var/flipped = FALSE var/flip_cooldown = 0 - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /datum/say_list/startreader emote_see = list("bobs", "digs around","gnashes at something","yawns","snaps at something") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/succlet.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/succlet.dm index 19b52cece9..7be6409b1b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/succlet.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/succlet.dm @@ -78,7 +78,6 @@ B.name = "stummy" B.desc = "It's a star shaped stomach. A stummy, if you will. It's warm and soft, not unlike plush, but it's tight!" B.mode_flags = DM_FLAG_THICKBELLY | DM_FLAG_NUMBING -// B.belly_fullscreen = "yet_another_tumby" //Chompedit - Belly Fullscreen change B.digest_brute = 0 B.digest_burn = 0 B.digest_oxy = 12 diff --git a/modular_chomp/code/modules/mob/living/simple_animal/aliens/synx.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/synx.dm similarity index 97% rename from modular_chomp/code/modules/mob/living/simple_animal/aliens/synx.dm rename to code/modules/mob/living/simple_mob/subtypes/animal/alien animals/synx.dm index 4540fcdf7f..b4caacc493 100644 --- a/modular_chomp/code/modules/mob/living/simple_animal/aliens/synx.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/synx.dm @@ -2,14 +2,14 @@ #define SYNX_UPPER_DAMAGE 6 -/mob/living/simple_mob/animal/synx/ //Player controlled variant +/mob/living/simple_mob/animal/synx //Player controlled variant //on inteligence https://synx.fandom.com/wiki/Behavior/Intelligence //keeping this here for player controlled synxes. name = "Synx" desc = "A cold blooded, genderless, parasitic eel from the more distant and stranger areas of the cosmos. Plain, white, perpetually grinning and possessing a hunger as enthusiastic and endless as humanity's sense of exploration." tt_desc = "synxus pergulus" //Synx species belongs to ChimeraSynx , Base sprites made by: SpitefulCrow - icon = 'modular_chomp/icons/mob/synx_modular.dmi'//giving synxes their own DMI file! + icon = 'icons/mob/synx_modular.dmi'//giving synxes their own DMI file! icon_state = "synx_living" icon_living = "synx_living" icon_dead = "synx_dead" @@ -110,13 +110,6 @@ attack_edge = 1 attack_armor_type = "melee" //Default is melee but I'm stating this explicitly to make it more obvious to anybody reading this -/mob/living/simple_mob/animal/synx/Initialize(mapload) - . = ..() - src.adjust_nutrition(src.max_nutrition) - build_icons(1) - voremob_loaded = 1 - mob_radio = new /obj/item/radio/headset/mob_headset(src) //We always give radios to spawned mobs anyway - //Vore stuff//leaving most of this here even though its no going to be an AI controlled variant. vore_active = 1 vore_capacity = 2 @@ -146,6 +139,16 @@ max_n2 = 0 //Maybe add a max // TODO: Set a max temperature of about 20-30 above room temperatures. Synx don't like the heat. + +/mob/living/simple_mob/animal/synx/Initialize(mapload) + . = ..() + src.adjust_nutrition(src.max_nutrition) + build_icons(1) + if(!voremob_loaded) + voremob_loaded = TRUE + init_vore() + mob_radio = new /obj/item/radio/headset/mob_headset(src) //We always give radios to spawned mobs anyway + /mob/living/simple_mob/animal/synx/get_available_emotes() . = ..() . |= _human_default_emotes //Synx are great at mimicking @@ -214,14 +217,14 @@ . = ..() if(is_pet) return - add_verb(src,/mob/living/proc/ventcrawl) //CHOMPEdit TGPanel - add_verb(src,/mob/living/simple_mob/animal/synx/proc/distend_stomach) //CHOMPEdit TGPanel - add_verb(src,/mob/living/simple_mob/proc/contort) //CHOMPEdit TGPanel - add_verb(src,/mob/living/simple_mob/animal/synx/proc/sonar_ping) //CHOMPEdit TGPanel - add_verb(src,/mob/living/proc/shred_limb) //CHOMPEdit TGPanel - add_verb(src,/mob/living/simple_mob/animal/synx/proc/disguise) //CHOMPEdit TGPanel - add_verb(src,/mob/living/simple_mob/animal/synx/proc/randomspeech) //CHOMPEdit TGPanel - add_verb(src,/mob/living/simple_mob/animal/synx/proc/set_style) //CHOMPEdit TGPanel + add_verb(src,/mob/living/proc/ventcrawl) + add_verb(src,/mob/living/simple_mob/animal/synx/proc/distend_stomach) + add_verb(src,/mob/living/simple_mob/proc/contort) + add_verb(src,/mob/living/simple_mob/animal/synx/proc/sonar_ping) + add_verb(src,/mob/living/proc/shred_limb) + add_verb(src,/mob/living/simple_mob/animal/synx/proc/disguise) + add_verb(src,/mob/living/simple_mob/animal/synx/proc/randomspeech) + add_verb(src,/mob/living/simple_mob/animal/synx/proc/set_style) realname = name voices += "Garbled voice" voices += "Unidentifiable Voice" @@ -670,7 +673,7 @@ var/list/options = list("Body","Horns","Marks","Eyes") for(var/option in options) - LAZYSET(options, option, new /image('icons/effects/synx_labels_ch.dmi', option)) + LAZYSET(options, option, new /image('icons/effects/synx_labels.dmi', option)) var/choice = show_radial_menu(src, src, options, radius = 60) if(!choice || QDELETED(src) || src.incapacitated()) return FALSE @@ -679,7 +682,7 @@ if("Body") options = body_styles for(var/option in options) - var/image/I = new /image('modular_chomp/icons/mob/synx_modular.dmi', "synx_body[option]", dir = 2) + var/image/I = new /image('icons/mob/synx_modular.dmi', "synx_body[option]", dir = 2) LAZYSET(options, option, I) choice = show_radial_menu(src, src, options, radius = 90) if(!choice || QDELETED(src) || src.incapacitated()) @@ -692,7 +695,7 @@ if("Horns") options = horn_styles for(var/option in options) - var/image/I = new /image('modular_chomp/icons/mob/synx_modular.dmi', "synx_horns[option]", dir = 2) + var/image/I = new /image('icons/mob/synx_modular.dmi', "synx_horns[option]", dir = 2) LAZYSET(options, option, I) choice = show_radial_menu(src, src, options, radius = 90) if(!choice || QDELETED(src) || src.incapacitated()) @@ -705,7 +708,7 @@ if("Marks") options = marking_styles for(var/option in options) - var/image/I = new /image('modular_chomp/icons/mob/synx_modular.dmi', "synx_markings[option]", dir = 2) + var/image/I = new /image('icons/mob/synx_modular.dmi', "synx_markings[option]", dir = 2) LAZYSET(options, option, I) choice = show_radial_menu(src, src, options, radius = 90) if(!choice || QDELETED(src) || src.incapacitated()) @@ -718,7 +721,7 @@ if("Eyes") options = eye_styles for(var/option in options) - var/image/I = new /image('modular_chomp/icons/mob/synx_modular.dmi', "synx_eyes[option]", dir = 2) + var/image/I = new /image('icons/mob/synx_modular.dmi', "synx_eyes[option]", dir = 2) LAZYSET(options, option, I) choice = show_radial_menu(src, src, options, radius = 90) if(!choice || QDELETED(src) || src.incapacitated()) @@ -957,9 +960,9 @@ /mob/living/simple_mob/animal/synx/ai/pet/debug/Initialize(mapload) . = ..(mapload, TRUE) - add_verb(src,/mob/living/simple_mob/animal/synx/ai/pet/debug/proc/rename) //CHOMPEdit TGPanel - add_verb(src,/mob/living/simple_mob/animal/synx/ai/pet/debug/proc/resprite) //CHOMPEdit TGPanel - add_verb(src,/mob/living/simple_mob/animal/synx/ai/pet/debug/proc/redesc) //CHOMPEdit TGPanel + add_verb(src,/mob/living/simple_mob/animal/synx/ai/pet/debug/proc/rename) + add_verb(src,/mob/living/simple_mob/animal/synx/ai/pet/debug/proc/resprite) + add_verb(src,/mob/living/simple_mob/animal/synx/ai/pet/debug/proc/redesc) //////////////////////////////////////// ////////////////SYNX SPAWNER//////////// diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm index c277d98216..d2ef832f0a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm @@ -164,7 +164,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have? vore_pounce_chance = 35 vore_pounce_falloff = 0 vore_standing_too = TRUE - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/vore/alienanimals/teppi/load_default_bellies() . = ..() @@ -172,7 +172,6 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have? B.name = "stomach" B.desc = "The heat of the roiling flesh around you bakes into you immediately as you're cast into the gloom of a Teppi's primary gastric chamber. The undulations are practically smothering, clinging to you and grinding you all over as the Teppi continues about its day. The walls are heavy against you, so it's really difficult to move at all, while the heart of this creature pulses rhythmically somewhere nearby, and you can feel the throb of its pulse in the doughy squish pressing up against you. Your figure sinks a ways into the flesh as it presses in, wrapping limbs up between countless slick folds and kneading waves. It's not long before you're positively soaked in a thin layer of slime as you're rocked and squeezed and jostled in the stomach of your captor." B.mode_flags = 40 -// B.belly_fullscreen = "yet_another_tumby" //Chompedit - Belly Fullscreen change B.digest_brute = 0.05 B.digest_burn = 0.05 B.digestchance = 5 @@ -302,7 +301,6 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have? p.contamination_flavor = "Wet" p.contamination_color = "grey" p.item_digest_mode = IM_HOLD -// p.belly_fullscreen = "yet_another_tumby" //Chompedit - Belly Fullscreen change p.fancy_vore = 1 p.vore_verb = "nyomp" friend_zone = p @@ -622,7 +620,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have? if(prob(25)) M.visible_message(span_notice("\The [src] rumbles happily at \the [M]"),span_notice("\The [src] rumbles happily at you!")) playsound(src, 'sound/voice/teppi/rumble.ogg', 75, 1) - if(vore_selected) //CHOMPEdit + if(vore_selected) vore_selected.digest_mode = DM_DRAIN //People outside can help calm the tumby if you squirm too much else if(prob(25)) M.visible_message(span_notice("\The [src] rumbles happily at \the [M]"),span_notice("\The [src] rumbles happily at you!")) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer.dm b/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer.dm index 9247698f02..de04712591 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer.dm @@ -44,7 +44,7 @@ var/used_dominate // world.time when the dominate power was last used. var/datum/ghost_query/Q // Used to unregister our signal - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/animal/borer/roundstart roundstart = TRUE diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm index 384bc59963..e18a04cd27 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm @@ -69,8 +69,8 @@ icon_dead = "guard_dead" has_eye_glow = TRUE density = FALSE - minbodytemp = 175 //yw edit, Makes mobs survive cryogaia temps - faction = FACTION_AWAYMISSION //yw edit, Makes away mobs be on the same fuckin' side. + minbodytemp = 175 + faction = FACTION_SPIDERS maxHealth = 200 health = 200 pass_flags = PASSTABLE diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/broodmother_spawn.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/broodmother_spawn.dm index fcccd74641..00a2a4e787 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/broodmother_spawn.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/broodmother_spawn.dm @@ -15,9 +15,8 @@ /mob/living/simple_mob/animal/giant_spider/frost/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) - spawn(1) - if(!QDELETED(src)) - qdel(src) + if(!QDELETED(src)) + qdel(src) /mob/living/simple_mob/animal/giant_spider/electric/broodling maxHealth = 30 @@ -36,9 +35,8 @@ /mob/living/simple_mob/animal/giant_spider/electric/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) - spawn(1) - if(!QDELETED(src)) - qdel(src) + if(!QDELETED(src)) + qdel(src) /mob/living/simple_mob/animal/giant_spider/hunter/broodling maxHealth = 40 @@ -54,9 +52,8 @@ /mob/living/simple_mob/animal/giant_spider/hunter/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) - spawn(1) - if(!QDELETED(src)) - qdel(src) + if(!QDELETED(src)) + qdel(src) /mob/living/simple_mob/animal/giant_spider/lurker/broodling maxHealth = 40 @@ -72,9 +69,8 @@ /mob/living/simple_mob/animal/giant_spider/lurker/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) - spawn(1) - if(!QDELETED(src)) - qdel(src) + if(!QDELETED(src)) + qdel(src) /mob/living/simple_mob/animal/giant_spider/nurse/broodling maxHealth = 60 @@ -91,9 +87,8 @@ /mob/living/simple_mob/animal/giant_spider/nurse/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) - spawn(1) - if(!QDELETED(src)) - qdel(src) + if(!QDELETED(src)) + qdel(src) /mob/living/simple_mob/animal/giant_spider/pepper/broodling maxHealth = 40 @@ -109,9 +104,8 @@ /mob/living/simple_mob/animal/giant_spider/pepper/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) - spawn(1) - if(!QDELETED(src)) - qdel(src) + if(!QDELETED(src)) + qdel(src) /mob/living/simple_mob/animal/giant_spider/thermic/broodling maxHealth = 40 @@ -130,9 +124,8 @@ /mob/living/simple_mob/animal/giant_spider/thermic/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) - spawn(1) - if(!QDELETED(src)) - qdel(src) + if(!QDELETED(src)) + qdel(src) /mob/living/simple_mob/animal/giant_spider/tunneler/broodling maxHealth = 40 @@ -148,9 +141,8 @@ /mob/living/simple_mob/animal/giant_spider/tunneler/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) - spawn(1) - if(!QDELETED(src)) - qdel(src) + if(!QDELETED(src)) + qdel(src) /mob/living/simple_mob/animal/giant_spider/webslinger/broodling maxHealth = 30 @@ -168,9 +160,8 @@ /mob/living/simple_mob/animal/giant_spider/webslinger/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) - spawn(1) - if(!QDELETED(src)) - qdel(src) + if(!QDELETED(src)) + qdel(src) /mob/living/simple_mob/animal/giant_spider/broodling maxHealth = 60 @@ -197,6 +188,5 @@ /mob/living/simple_mob/animal/giant_spider/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) - spawn(1) - if(!QDELETED(src)) - qdel(src) + if(!QDELETED(src)) + qdel(src) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/carrier.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/carrier.dm index 05c5c245b8..9d2085d444 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/carrier.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/carrier.dm @@ -86,5 +86,5 @@ swarmling_type = /mob/living/simple_mob/animal/giant_spider/carrier/recursive -/mob/living/simple_mob/animal/giant_spider/carrier/event // YW CHANGE +/mob/living/simple_mob/animal/giant_spider/carrier/event ai_holder_type = /datum/ai_holder/simple_mob/event diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/electric.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/electric.dm index fccc0003c4..fa4391f099 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/electric.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/electric.dm @@ -61,5 +61,5 @@ return 1 return ..() // Do ranged if possible otherwise. -/mob/living/simple_mob/animal/giant_spider/electric/event // YW CHANGE +/mob/living/simple_mob/animal/giant_spider/electric/event ai_holder_type = /datum/ai_holder/simple_mob/event diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/frost.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/frost.dm index 4df9d0256a..b9a524a7df 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/frost.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/frost.dm @@ -36,5 +36,5 @@ desc = "Icy and blue, it makes you shudder to look at it. This one has brilliant blue eyes. \ It isn't native to Sif." -/mob/living/simple_mob/animal/giant_spider/frost/event // YW CHANGE +/mob/living/simple_mob/animal/giant_spider/frost/event ai_holder_type = /datum/ai_holder/simple_mob/event diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm index c3cdabecb0..cadc20d758 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm @@ -55,10 +55,10 @@ egg_type = /obj/effect/spider/eggcluster/royal -/mob/living/simple_mob/animal/giant_spider/webslinger/event // YW CHANGE +/mob/living/simple_mob/animal/giant_spider/webslinger/event ai_holder_type = /datum/ai_holder/simple_mob/event -/mob/living/simple_mob/animal/giant_spider/nurse/queen/event // YW CHANGE +/mob/living/simple_mob/animal/giant_spider/nurse/queen/event ai_holder_type = /datum/ai_holder/simple_mob/event /mob/living/simple_mob/animal/giant_spider/nurse diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/hunter.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/hunter.dm index e3b954ccb2..6fcbdcc3a2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/hunter.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/hunter.dm @@ -178,5 +178,5 @@ if(move_to) give_destination(move_to, min_distance = 2, combat = TRUE) // This will switch our stance. */ -/mob/living/simple_mob/animal/giant_spider/hunter/event // YW CHANGE +/mob/living/simple_mob/animal/giant_spider/hunter/event ai_holder_type = /datum/ai_holder/simple_mob/event diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/lurker.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/lurker.dm index 8052bd43c9..2f10c1ebe5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/lurker.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/lurker.dm @@ -102,7 +102,7 @@ if(cloaked) if(isliving(A)) var/mob/living/L = A - L.add_modifier(/datum/modifier/entangled, 2 SECONDS) //L.Weaken(cloaked_weaken_amount) CHOMPEdit: Trying to remove hardstuns + L.add_modifier(/datum/modifier/entangled, 2 SECONDS) //L.Weaken(cloaked_weaken_amount) to_chat(L, span_danger("\The [src] ambushes you!")) playsound(src, 'sound/weapons/spiderlunge.ogg', 75, 1) uncloak() diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/nurse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/nurse.dm index 64f4d95ef1..c6682c40bb 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/nurse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/nurse.dm @@ -82,7 +82,7 @@ var/mob/living/L = A if(!L.stat) return ..() - else //CHOMPStation edit: no infinite spider glitch for buckled mobs + else if (L.anchored && L.buckled && !(L.pulledby || L.buckled.pulledby)) //don't have them trying to unbuckle someone on something that's being pulled because that's just annoying as fuck esp for a medic or something L.buckled.unbuckle_mob(L) if (!L.anchored) @@ -101,7 +101,7 @@ /mob/living/simple_mob/animal/giant_spider/nurse/proc/spin_cocoon(atom/movable/AM) if(!istype(AM)) return FALSE // We can't cocoon walls sadly. - if(istype(AM, /mob/living/simple_mob/animal/giant_spider)) //CHOMPEdit addition + if(istype(AM, /mob/living/simple_mob/animal/giant_spider)) return FALSE visible_message(span_notice("\The [src] begins to secrete a sticky substance around \the [AM].")) @@ -271,11 +271,11 @@ /datum/ai_holder/simple_mob/melee/nurse_spider/can_attack(atom/movable/the_target, var/vision_required = TRUE) . = ..() if(!.) // Parent returned FALSE. - if (istype(the_target, /mob/living/simple_mob/animal/giant_spider)) //CHOMPEdit addition + if (istype(the_target, /mob/living/simple_mob/animal/giant_spider)) var/mob/living/L = the_target if (L.stat) return FALSE - if(istype(the_target, /obj) && (!vision_required || can_see_target(the_target))) //CHOMPEdit - they should be passing the can_see_target check + if(istype(the_target, /obj) && (!vision_required || can_see_target(the_target))) var/obj/O = the_target if(!O.anchored) return TRUE diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/tunneler.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/tunneler.dm index 7e405c8a1b..e757328cf2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/tunneler.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/tunneler.dm @@ -116,7 +116,7 @@ visible_message(span_danger("\The [src] erupts from underneath, and hits \the [L]!")) playsound(src, 'sound/weapons/heavysmash.ogg', 75, 1) - L.add_modifier(/datum/modifier/entangled, 3 SECONDS) //L.Weaken(3) CHOMPedit: Removal of stuns + L.add_modifier(/datum/modifier/entangled, 3 SECONDS) //L.Weaken(3) overshoot = FALSE if(!overshoot) // We hit the target, or something, at destination, so we're done. @@ -207,3 +207,18 @@ incoming_damage_percent = 2 evasion = -100 + +/mob/living/simple_mob/animal/giant_spider/tunneler/cave + name = "cave spider" + desc = "Sandy and brown, it makes you shudder to look at it. However, this one doesn't seem very interested in bothering you." + maxHealth = 25 + health = 25 + harm_intent_damage = 5 + melee_damage_lower = 5 + melee_damage_upper = 5 + ai_holder_type = /datum/ai_holder/simple_mob/retaliate + meat_amount = 1 // Scrawny little things! It's no wonder they don't want to fight you! + +/mob/living/simple_mob/animal/giant_spider/tunneler/cave/Initialize(mapload) + . = ..() + resize(0.50) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/hyena/hyena.dm b/code/modules/mob/living/simple_mob/subtypes/animal/hyena/hyena.dm index 2331dd864e..57f1f7387f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/hyena/hyena.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/hyena/hyena.dm @@ -24,7 +24,7 @@ They're also cool, and Rykka/Nyria wrote this uwu tt_desc = "Crocuta crocuta" catalogue_data = list(/datum/category_item/catalogue/fauna/hyena) - icon = 'modular_chomp/icons/mob/animals48x32_ch.dmi' + icon = 'icons/mob/hyena.dmi' icon_state = "yeen" icon_living = "yeen" icon_dead = "yeen_dead" @@ -82,7 +82,7 @@ They're also cool, and Rykka/Nyria wrote this uwu say_list_type = /datum/say_list/hyena - allow_mind_transfer = TRUE //CHOMPAdd + allow_mind_transfer = TRUE var/obj/item/clothing/head/hat = null // The hat the yeen is wearing when initialized, var will update with the chosen hat. @@ -90,7 +90,7 @@ They're also cool, and Rykka/Nyria wrote this uwu /mob/living/simple_mob/animal/hyena/verb/remove_hat() set name = "Remove Hat" set desc = "Remove the yeen's hat. You monster. ;~;" - set category = "Abilities.Hyena" //CHOMPEdit + set category = "Abilities.Hyena" set src in view(1) drop_hat(usr) @@ -113,7 +113,7 @@ They're also cool, and Rykka/Nyria wrote this uwu /mob/living/simple_mob/animal/hyena/verb/give_hat() set name = "Give Hat" set desc = "Give the yeen a hat. You wonderful bean. <3" - set category = "Abilities.Hyena" //CHOMPEdit + set category = "Abilities.Hyena" set src in view(1) take_hat(usr) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/armadillo_ch.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/armadillo.dm similarity index 96% rename from code/modules/mob/living/simple_mob/subtypes/animal/passive/armadillo_ch.dm rename to code/modules/mob/living/simple_mob/subtypes/animal/passive/armadillo.dm index 9a914a1d9f..2d705e7c10 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/armadillo_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/armadillo.dm @@ -5,7 +5,7 @@ tt_desc = "Dasypus novemcinctus" //faction = "mexico" //They are from Mexico. //Amusing but this prompts aggression from crew-aligned mobs. - icon = 'modular_chomp/icons/mob/animal_ch.dmi' + icon = 'icons/mob/animal.dmi' icon_state = "armadillo" item_state = "armadillo_rest" icon_living = "armadillo" @@ -130,7 +130,6 @@ update_icon() /datum/say_list/armadillo -// speak = list("Churr","Rumble!","Chirr?") //These are sounds, not things something speaks. It's also redundant with the speak_emotes. emote_hear = list("churrs","rumbles","chirrs") emote_see = list("rolls in place", "shuffles", "scritches at something") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/cockroach.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/cockroach.dm index 6653491eba..345cae7bcc 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/cockroach.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/cockroach.dm @@ -13,7 +13,7 @@ maxHealth = 1 health = 1 - nutrition = 20 //CHOMPEdit + nutrition = 20 movement_cooldown = -1 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm index cf8e3c2e5f..a1cfb43580 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm @@ -11,7 +11,7 @@ icon = 'icons/mob/fish.dmi' item_state = "fish" - catalogue_data = list(/datum/category_item/catalogue/fauna/invasive_fish) + catalogue_data = list(/datum/category_item/catalogue/fauna/invasive_fish) // CHOMPEnable mob_size = MOB_SMALL // So fish are actually underwater. diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard_mutant_event.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard_mutant_event.dm index bcb2754038..703480bf68 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard_mutant_event.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard_mutant_event.dm @@ -14,14 +14,13 @@ /mob/living/simple_mob/animal/passive/lizard/event/proc/man() var/mob/bigger = new /mob/living/simple_mob/vore/aggressive/lizardman(get_turf(src)) - if(istype(loc,/obj/belly)){ + if(istype(loc,/obj/belly)) var/obj/belly/B = loc - B.owner.visible_message(span_warning("Something grows inside [B.owner]'s [lowertext(B.name)]!")) + B.owner.visible_message(span_boldwarning("Something grows inside [B.owner]'s [lowertext(B.name)]!")) to_chat(B.owner, span_warning("\The [src] suddenly evolves inside your [lowertext(B.name)]!")) B.release_specific_contents(src, TRUE) B.nom_mob(bigger, null) qdel(src) - }else{ + else visible_message(span_warning("\The [src] suddenly evolves!")) qdel(src) - } diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index daf0bbcf31..dc2445e3d9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -46,27 +46,22 @@ var/list/datum/disease/rat_diseases - //CHOMP Addition: Added these vore variables in and swapped the booleans from their defaults too. can_be_drop_prey = TRUE can_be_drop_pred = FALSE species_sounds = "Mouse" - pain_emote_1p = list("squeak", "squik") // CHOMP Addition: Pain/etc sounds - pain_emote_1p = list("squeaks", "squiks") // CHOMP Addition: Pain/etc sounds + pain_emote_1p = list("squeak", "squik") + pain_emote_1p = list("squeaks", "squiks") -//CHOMPAdd Start /mob/living/simple_mob/animal/passive/mouse/Destroy() GLOB.active_ghost_pods -= src return ..() -//CHOMPAdd End /mob/living/simple_mob/animal/passive/mouse/Initialize(mapload, keep_parent_data) . = ..() - //CHOMPAdd Start - ghostjoin = 1 + ghostjoin = TRUE ghostjoin_icon() GLOB.active_ghost_pods += src - //CHOMPAdd End add_verb(src, /mob/living/proc/ventcrawl) add_verb(src, /mob/living/proc/hide) @@ -220,10 +215,9 @@ emote_hear = list("squeeks","squeaks","squiks") emote_see = list("runs in a circle", "shakes", "scritches at something") -// CHOMPAdd - Verb for mice colour changing /mob/living/simple_mob/animal/passive/mouse/verb/set_mouse_colour() set name = "Set Mouse Colour" - set category = "Abilities.Mouse" //CHOMPEdit + set category = "Abilities.Mouse" set desc = "Set the colour of your mouse." var/new_mouse_colour = tgui_input_list(usr, "Set Mouse Colour", "Pick a colour", list("brown","gray","white","black")) if(!new_mouse_colour) return @@ -235,8 +229,7 @@ desc = "A small [new_mouse_colour] rodent, often seen hiding in maintenance areas and making a nuisance of itself." holder_type = text2path("/obj/item/holder/mouse/[new_mouse_colour]") to_chat(src, span_notice("You are now a [new_mouse_colour] mouse!")) - remove_verb(src,/mob/living/simple_mob/animal/passive/mouse/verb/set_mouse_colour) //CHOMPEdit TGPanel -// CHOMPAdd End + remove_verb(src,/mob/living/simple_mob/animal/passive/mouse/verb/set_mouse_colour) /mob/living/simple_mob/animal/passive/mouse/white/virology name = "Fleming" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_mutant_event.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_mutant_event.dm index 02dac74008..08ba188e2b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_mutant_event.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_mutant_event.dm @@ -17,14 +17,13 @@ else bigger = new /mob/living/simple_mob/vore/aggressive/chungus(get_turf(src)) - if(istype(loc,/obj/belly)){ + if(istype(loc,/obj/belly)) var/obj/belly/B = loc - B.owner.visible_message(span_warning("Something grows inside [B.owner]'s [lowertext(B.name)]!")) + B.owner.visible_message(span_boldwarning("Something grows inside [B.owner]'s [lowertext(B.name)]!")) to_chat(B.owner, span_warning("\The [src] suddenly evolves inside your [lowertext(B.name)]!")) B.release_specific_contents(src, TRUE) B.nom_mob(bigger, null) qdel(src) - }else{ + else visible_message(span_warning("\The [src] suddenly evolves!")) qdel(src) - } diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm index f563cac690..9cfe40f2e0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm @@ -59,10 +59,40 @@ /mob/living/simple_mob/animal/passive/mouse/white/apple/Initialize(mapload, keep_parent_data) . = ..(mapload, TRUE) - /obj/item/holder/mouse/attack_self(mob/living/carbon/user) user.setClickCooldown(user.get_attack_speed()) for(var/L in contents) if(isanimal(L)) var/mob/living/simple_mob/S = L user.visible_message(span_notice("[user] [S.response_help] \the [S].")) + +/mob/living/simple_mob/animal/passive/mouse/mining + body_color = "brown" + icon = 'icons/mob/animal.dmi' + icon_state = "mouse_miner" + item_state = "mouse_miner" + icon_living = "mouse_miner" + name = "Cooper" + desc = "A lonely miner's best friend." + +/mob/living/simple_mob/animal/passive/mouse/mining/Initialize(mapload) + . = ..() + + add_verb(src,/mob/living/proc/ventcrawl) + add_verb(src,/mob/living/proc/hide) + icon_state = "mouse_miner" + item_state = "mouse_miner" + icon_living = "mouse_miner" + icon_dead = "mouse_miner_dead" + icon_rest = "mouse_miner_sleep" + desc = "A lonely miner's best friend." + + +/mob/living/simple_mob/animal/passive/mouse/mining/splat() + src.health = 0 + src.set_stat(DEAD) + src.icon_dead = "mouse_miner_splat" + src.icon_state = "mouse_miner_splat" + layer = MOB_LAYER + if(client) + client.time_died_as_mouse = world.time diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm index b907dd981d..96672965d0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm @@ -113,7 +113,7 @@ name = "Bockscar" real_name = "Bockscar" -/mob/living/simple_mob/animal/passive/dog/corgi/puppy/wiggle //yw addition +/mob/living/simple_mob/animal/passive/dog/corgi/puppy/wiggle name = "Mister Wiggles" real_name = "Mister Wiggles" desc = "An emotional support corgi! He gets along with everyone, even Runtime." diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/duck.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/duck.dm index 33f7555de3..1065ee30a0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/duck.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/duck.dm @@ -17,7 +17,7 @@ name = "crystal-feather duck" desc = "A glittering flightless bird." tt_desc = "S Anatidae vitriae" - catalogue_data = list(/datum/category_item/catalogue/fauna/crystalduck) + catalogue_data = list(/datum/category_item/catalogue/fauna/crystalduck) // CHOMPEnable faction = FACTION_DUCK diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm index 0560899f49..d38976d53e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm @@ -34,7 +34,7 @@ maxHealth = 65 health = 65 - minbodytemp = 175 //yw edit, Makes mobs survive cryogaia temps + minbodytemp = 175 pass_flags = PASSTABLE var/energy = 100 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hare.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hare.dm index 9e62c0f44c..d35b44a7c8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hare.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hare.dm @@ -65,7 +65,7 @@ say_list_type = /datum/say_list/hare - can_be_drop_prey = TRUE //CHOMP Add + can_be_drop_prey = TRUE /datum/say_list/hare speak = list("Snrf...","Crk!") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm index 4235ba9f8c..79a1e9d06a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm @@ -27,7 +27,7 @@ name = "hooligan crab" desc = "A large, hard-shelled crustacean. This one is mostly grey. \ You probably shouldn't mess with it." - catalogue_data = list(/datum/category_item/catalogue/fauna/hooligan_crab) + catalogue_data = list(/datum/category_item/catalogue/fauna/hooligan_crab) // CHOMPEnable icon_state = "sif_crab" icon_living = "sif_crab" @@ -89,7 +89,6 @@ var/weaken_amount = 2 // Be careful with this number. High values will equal a permastun. - // Stuns the thing that got hit briefly. /mob/living/simple_mob/animal/sif/hooligan_crab/apply_melee_effects(atom/A) if(isliving(A)) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm index 5d7ca8ea70..f930b29e92 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm @@ -33,7 +33,7 @@ default_pixel_x = -16 pixel_x = -16 - minbodytemp = 175 //yw edit, Makes mobs survive cryogaia temps + minbodytemp = 175 maxHealth = 200 health = 200 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm index 820586bf82..b2796040d1 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm @@ -33,7 +33,7 @@ status_flags = CANPUSH pass_flags = PASSTABLE - minbodytemp = 175 //yw edit, Makes mobs survive cryogaia temps + minbodytemp = 175 maxHealth = 100 health = 100 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm index c02e27f75f..797262d82f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm @@ -30,7 +30,7 @@ maxHealth = 125 health = 125 - minbodytemp = 175 //yw edit, Makes mobs survive cryogaia temps + minbodytemp = 175 movement_cooldown = -1 heat_resist = -0.50 cold_resist = 0.75 @@ -56,7 +56,6 @@ say_list_type = /datum/say_list/savik ai_holder_type = /datum/ai_holder/simple_mob/savik - /datum/say_list/savik speak = list("Hruuugh!","Hrunnph") emote_see = list("paws the ground","shakes its mane","stomps") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm index 2ede1dad86..4fd11d892e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm @@ -45,7 +45,7 @@ heat_resist = -0.50 cold_resist = 0.75 movement_cooldown = -1 - minbodytemp = 175 //yw edit, Makes mobs survive cryogaia temps + minbodytemp = 175 melee_damage_lower = 6 melee_damage_upper = 14 base_attack_cooldown = 1 SECOND @@ -59,7 +59,6 @@ say_list_type = /datum/say_list/shantak - /datum/say_list/shantak speak = list("Shuhn.","Shrunnph?","Shunpf.") emote_see = list("scratches the ground", "shakes out its mane", "clinks gently as it moves") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/sif.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/sif.dm index a05d5a116f..bc7123653e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/sif.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/sif.dm @@ -10,4 +10,4 @@ /obj/item/reagent_containers/food/snacks/meat = 10 ) - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/siffet.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/siffet.dm index ead35a13f4..1d45aaa4f4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/siffet.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/siffet.dm @@ -41,7 +41,6 @@ say_list_type = /datum/say_list/siffet ai_holder_type = /datum/ai_holder/simple_mob/siffet - /datum/say_list/siffet speak = list("Yap!", "Heh!", "Huff.") emote_see = list("sniffs its surroundings","flicks its ears", "scratches the ground") @@ -58,10 +57,8 @@ /mob/living/simple_mob/animal/sif/siffet/IIsAlly(mob/living/L) . = ..() - //CHOMPAdd START: Compatibility with structures if(!. && !istype(L, /mob/living)) return TRUE else if(!. && L.mob_size > 10) //Attacks things it considers small enough to take on, otherwise only attacks if attacked. return TRUE - //CHOMPAdd END diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm index a6bcbcbc44..bc0d04ad16 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm @@ -33,7 +33,7 @@ meat_type = /obj/item/reagent_containers/food/snacks/xenomeat meat_amount = 5 - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/animal/space/alien/drone name = "alien drone" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/animals_yw.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/animals_yw.dm deleted file mode 100644 index f75ad91a6c..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/animals_yw.dm +++ /dev/null @@ -1,194 +0,0 @@ -/mob/living/simple_mob/animal/passive/gaslamp/snow //Frostlamnp - name = "Frostlit Lamp" - desc = "Some sort of floaty alien with a surprisingly warm glow. This creature is looks like an evolutionary offshute of the Gaslamp family." - tt_desc = "Semaeostomeae virginus" - icon = 'icons/mob/cryogaia32x64.dmi' - icon_state = "gaslamp" - icon_living = "gaslamp" - icon_dead = "gaslamp-dead" - - faction = "virgo3b" - maxHealth = 100 - health = 100 - movement_cooldown = 12 - - say_list_type = /datum/say_list/gaslamp - ai_holder_type = /datum/ai_holder/simple_mob/gaslamp - -// speed = 2 Virgo coders making my life hell. This conflicts with their new system - - melee_damage_lower = 5 // Because fuck anyone who hurts this sweet, innocent creature. CHOMPS KSC 8/12/20 "I don't care if they are sweet, 30 damage a wrong way to balance cuteness" - melee_damage_upper = 10 - attacktext = list("thrashed") - friendly = "caressed" - - response_help = "brushes" // If clicked on help intent - response_disarm = "pushes" // If clicked on disarm intent - response_harm = "swats" // If clicked on harm intent - - minbodytemp = 0 - maxbodytemp = 350 - - min_oxy = 1 //Needs Oxy to survive on cryogaia - max_oxy = 0 // Hopefully no Max oxy - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - -//Code for chaplains pet. -/mob/living/simple_mob/clockwork - name = "Clockwork Marauder" - desc = "The stalwart apparition of a clockwork flame guardian. It's eternal flame glows a firey-red." - tt_desc = "Aeterna flamma armis" - icon = 'icons/mob/clockwork_mobs.dmi' - icon_state = "clockwork_marauder" - item_state = "clockwork_marauder" - icon_living = "clockwork_marauder" - icon_dead = "fallen_armor" - icon_rest = "clockwork_marauder" - - movement_cooldown = 0.5 SECONDS - - see_in_dark = 6 // Not sure if this actually works. - - - response_help = "pats" - response_disarm = "gently pushes aside" - response_harm = "kicks" - - min_oxy = 16 //Require atleast 16kPA oxygen - minbodytemp = 223 //Below -50 Degrees Celcius - maxbodytemp = 323 //Above 50 Degrees Celcius - - has_langs = list("Occursus") -/* speak_chance = 1 - speak = list("Heretics!","Burn them!","Protect believers!","Hail Helios") - speak_emote = list("crackles", "burns") - emote_hear = list("crackles","burns") - emote_see = list("twists their sword", "adjusts their shield") - say_maybe_target = list("Who?","Strange.") - say_got_target = list("Purge!","Cleanse!","Burn!") */ - - meat_amount = 0 - meat_type = /obj/item/reagent_containers/food/snacks/meat - - var/turns_since_scan = 0 - var/mob/flee_target - - can_be_drop_prey = FALSE //CHOMP Add - -/mob/living/simple_mob/clockwork/handle_special() - if(!stat && prob(2)) // spooky - var/mob/observer/dead/spook = locate() in range(src, 5) - if(spook) - var/turf/T = get_turf(spook) - var/list/visible = list() - for(var/obj/O in T.contents) - if(!O.invisibility && O.name) - visible += O - if(visible.len) - var/atom/A = pick(visible) - visible_emote("suddenly stops and stares at something unseen[istype(A) ? " near [A]":""].") - - - -//Basic friend AI -/*/mob/living/simple_animal/clockwork/fluff - var/mob/living/carbon/human/friend - var/befriend_job = null - -/mob/living/simple_animal/clockwork/fluff/Life() - . = ..() - if(!. || ai_inactive || !friend) return - - var/friend_dist = get_dist(src,friend) - - if (friend_dist <= 4) - if(stance == STANCE_IDLE) - if(set_follow(friend)) - handle_stance(STANCE_FOLLOW) - - if (friend_dist <= 1) - if (friend.stat >= DEAD || friend.health <= config.health_threshold_softcrit) - if (prob((friend.stat < DEAD)? 50 : 15)) - var/verb = pick("meows", "mews", "mrowls") - audible_emote(pick("[verb] in distress.", "[verb] anxiously.")) - else - if (prob(5)) - visible_emote(pick("nuzzles [friend].", - "brushes against [friend].", - "rubs against [friend].", - "purrs.")) - else if (friend.health <= 50) - if (prob(10)) - var/verb = pick("meows", "mews", "mrowls") - audible_emote("[verb] anxiously.") - -/mob/living/simple_animal/cat/fluff/verb/become_friends() - set name = "Become Friends" - set category = "Abilities.General" //CHOMPEdit - set src in view(1) - - if(!friend) - var/mob/living/carbon/human/H = usr - if(istype(H) && (!befriend_job || H.job == befriend_job)) - friend = usr - . = 1 - else if(usr == friend) - . = 1 //already friends, but show success anyways - - if(.) - set_dir(get_dir(src, friend)) - visible_emote(pick("nuzzles [friend].", - "brushes against [friend].", - "rubs against [friend].", - "purrs.")) - else - usr << span_notice("[src] ignores you.") - return */ - -/mob/living/simple_mob/clockwork/fluff/Ignis - name = "Ignis" - desc = "The stalwart apparition of a clockwork flame guardian. This one appears to be to be have been somehow modified to be 'docile', it's living fire turned blue." -// tt_desc = "Aeterna flamma armis" //Chaplains new pet! - icon = 'icons/mob/clockwork_mobs.dmi' - icon_state = "ignis" - item_state = "ignis" -// icon_living = "ignis" -// icon_dead = "fallen_armor" -// icon_rest = "ignis" -// retaliate = 1 // In theory this will make Ignis fight back. Maybe. -RF - -/mob/living/simple_mob/animal/passive/mouse/mining - body_color = "brown" - icon = 'icons/mob/animal_yw.dmi' - icon_state = "mouse_miner" - item_state = "mouse_miner" - icon_living = "mouse_miner" - name = "Cooper" - desc = "A lonely miner's best friend." - -/mob/living/simple_mob/animal/passive/mouse/mining/Initialize(mapload) - . = ..() - - add_verb(src,/mob/living/proc/ventcrawl) //CHOMPEdit TGPanel - add_verb(src,/mob/living/proc/hide) //CHOMPEdit TGPanel - icon_state = "mouse_miner" - item_state = "mouse_miner" - icon_living = "mouse_miner" - icon_dead = "mouse_miner_dead" - icon_rest = "mouse_miner_sleep" - desc = "A lonely miner's best friend." - - -/mob/living/simple_mob/animal/passive/mouse/mining/splat() - src.health = 0 - src.set_stat(DEAD) - src.icon_dead = "mouse_miner_splat" - src.icon_state = "mouse_miner_splat" - layer = MOB_LAYER - if(client) - client.time_died_as_mouse = world.time diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/bats.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/bats.dm index 3fb0226920..610664af4a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/bats.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/bats.dm @@ -39,7 +39,7 @@ var/scare_chance = 15 - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/animal/space/bats/apply_melee_effects(var/atom/A) if(isliving(A)) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/bear.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/bear.dm index fb4f4a17d0..9674d4230b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/bear.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/bear.dm @@ -27,7 +27,7 @@ say_list_type = /datum/say_list/bear - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE allow_mind_transfer = TRUE /datum/say_list/bear diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/carp.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/carp.dm index 9150efaf89..3bccc69cc3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/carp.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/carp.dm @@ -43,7 +43,7 @@ density = FALSE vore_active = TRUE - vore_icons = 0 //CHOMPSTATION EDIT - Require new sprites + vore_icons = 0 response_help = "pets" response_disarm = "gently pushes aside" response_harm = "hits" @@ -86,7 +86,7 @@ var/static/list/carp_colors_rare = list(\ "silver" = "#fdfbf3", \ ) - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/animal/space/carp/Initialize(mapload) . = ..() @@ -148,9 +148,47 @@ if(isliving(A)) var/mob/living/L = A if(prob(knockdown_chance)) - L.add_modifier(/datum/modifier/entangled, 4 SECONDS) //CHOMPedit, replacing weaken/slowdown with slow down + L.add_modifier(/datum/modifier/entangled, 4 SECONDS) // replacing weaken/slowdown with slow down L.visible_message(span_danger("\The [src] knocks down \the [L]!")) +/mob/living/simple_mob/animal/space/carp/load_default_bellies() + . = ..() + var/obj/belly/B = vore_selected + B.name = "Stomach" + B.desc = "The toothy jaws of the space carp gnash down around your body while its throat opens up to suck you inside. The vicious attack is too swift for you to stop it. You're dragged down its short esophagus, then dumped into its muscular digestive system. Your body curls tight in the cramped confines of its slimy stomach; pushing aside a caustic mixture of other unrecognizable detritus. You realize the soupy chime consists of past explorers who went missing long ago. If you can't push your way back up to freedom, your fate will be the same." + B.mode_flags = DM_FLAG_THICKBELLY + B.digest_brute = 0.5 + B.digest_burn = 0.5 + B.escapechance = 20 + B.belly_fullscreen = "anim_belly" + B.belly_fullscreen_color = "#660021" + B.belly_fullscreen_color2 = "#660021" + B.fancy_vore = 1 + + B.emote_lists[DM_DIGEST] = list( + "They say a space carp's belly can digest almost anything. You're going to find out first hand if you stay here for much longer.", + "The gastric fluids sizzle ferociously as they ooze across your form.", + "A possessive squeeze of the wrinkled walls forces you to scrunch against yourself, as if to say you're not even a bother. This powerful digestive system has processed far more hazardous prey than you.", + "The rubbery flesh of the carp's stomach lining constantly pulverizes you from all sides.", + "Slowly but surely, everything around you is digested. Organic or not, it's all nourishment to the carp.", + "The carp's disgusting innards slowly mix you around with acid. As far as it's concerned, you're nothing but fish food now.", + "The stomach walls of the fishy predator push against you from all sides, smushing you into the leftovers of the last adventurer to wind up here.", + "The carp's belly gushes over you with slow, muscular compressions. Every passing second allows more acid to be rubbed against you." + ) + + B.struggle_messages_inside = list( + "You jab with all your strength to free yourself from the carp's putrid gut.", + "The carp's belly bounces at your thrashing while the creature hunts its next meal.", + "You push and pry at the stomach sphincter, trying to force your way out.", + "You shove against the back of the carp's stomach for leverage as you try forcing your head up its throat.", + "You try to wriggle yourself out of the carp's belly before it grinds you into chum.", + "Your feisty squirming is rewarded with a tight CLENCH from all sides. The carp stubbornly reminds you that it has eaten far worse." + ) + + B.struggle_messages_outside = list( + "%pred's stomach lurches with movement beneath its underbelly scales. Someone is alive in there!" + ) + // Subtypes. // Won't wander away. @@ -182,11 +220,11 @@ /mob/living/simple_mob/animal/space/carp/large/huge name = "great white carp" desc = "A very rare breed of carp- and a very aggressive one." - icon = 'icons/mob/vore64x64.dmi' //CHOMPSTATION EDIT + icon = 'icons/mob/vore64x64.dmi' icon_dead = "megacarp_dead" icon_living = "megacarp" icon_state = "megacarp" - vore_icons = SA_ICON_LIVING //CHOMPSTATION EDIT + vore_icons = SA_ICON_LIVING maxHealth = 230 health = 230 @@ -207,11 +245,6 @@ /mob/living/simple_mob/animal/space/carp/large/huge/vorny name = "great white carp" desc = "A very rare breed of carp- and a very hungry one." - icon = 'icons/mob/vore64x64.dmi' //CHOMPSTATION EDIT - icon_dead = "megacarp_dead" - icon_living = "megacarp" - icon_state = "megacarp" - vore_icons = SA_ICON_LIVING //CHOMPSTATION ADDITION maxHealth = 230 health = 230 @@ -236,7 +269,6 @@ B.name = "stomach" B.desc = "You've been swallowed whole and alive by a massive white carp! The stomach around you is oppressively tight, squeezing and grinding wrinkled walls across your body, making it hard to make any movement at all. The chamber is flooded with fluids that completely overwhelm you." B.mode_flags = DM_FLAG_THICKBELLY - //B.belly_fullscreen = "yet_another_tumby" //Chompedit - Belly Fullscreen change B.digest_brute = 2 B.digest_burn = 2 B.digest_oxy = 1 diff --git a/code/modules/mob/living/simple_animal/animals/clockwork.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/clockwork.dm similarity index 61% rename from code/modules/mob/living/simple_animal/animals/clockwork.dm rename to code/modules/mob/living/simple_mob/subtypes/animal/space/clockwork.dm index cba3824300..843ec987df 100644 --- a/code/modules/mob/living/simple_animal/animals/clockwork.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/clockwork.dm @@ -1,22 +1,19 @@ -/mob/living/simple_animal/clockwork +//Code for chaplains pet. +/mob/living/simple_mob/clockwork name = "Clockwork Marauder" desc = "The stalwart apparition of a clockwork flame guardian. It's eternal flame glows a firey-red." tt_desc = "Aeterna flamma armis" - intelligence_level = SA_ANIMAL icon = 'icons/mob/clockwork_mobs.dmi' - icon_state = "clockwork_marauder" - item_state = "clockwork_marauder" - icon_living = "clockwork_marauder" + icon_state = "clockwork_marauder_r" + item_state = "clockwork_marauder_r" + icon_living = "clockwork_marauder_r" icon_dead = "fallen_armor" - icon_rest = "clockwork_marauder" + icon_rest = "clockwork_marauder_r" + + movement_cooldown = 0.5 SECONDS + + see_in_dark = 6 // Not sure if this actually works. - investigates = 1 - specific_targets = 1 //Only targets with Found() - run_at_them = 0 //DOMESTICATED - view_range = 5 - harm_intent_damage = 10 - turns_per_move = 5 - see_in_dark = 6 response_help = "pats" response_disarm = "gently pushes aside" @@ -26,16 +23,14 @@ minbodytemp = 223 //Below -50 Degrees Celcius maxbodytemp = 323 //Above 50 Degrees Celcius - mob_size = MOB_SMALL - has_langs = list("Occursus") - speak_chance = 1 +/* speak_chance = 1 speak = list("Heretics!","Burn them!","Protect believers!","Hail Helios") speak_emote = list("crackles", "burns") emote_hear = list("crackles","burns") emote_see = list("twists their sword", "adjusts their shield") say_maybe_target = list("Who?","Strange.") - say_got_target = list("Purge!","Cleanse!","Burn!") + say_got_target = list("Purge!","Cleanse!","Burn!") */ meat_amount = 0 meat_type = /obj/item/reagent_containers/food/snacks/meat @@ -43,14 +38,13 @@ var/turns_since_scan = 0 var/mob/flee_target -/mob/living/simple_animal/clockwork/Life() - . = ..() - if(!.) return + can_be_drop_prey = FALSE - if(prob(2)) //spooky - var/mob/observer/dead/spook = locate() in range(src,5) +/mob/living/simple_mob/clockwork/handle_special() + if(!stat && prob(2)) // spooky + var/mob/observer/dead/spook = locate() in range(src, 5) if(spook) - var/turf/T = spook.loc + var/turf/T = get_turf(spook) var/list/visible = list() for(var/obj/O in T.contents) if(!O.invisibility && O.name) @@ -59,31 +53,8 @@ var/atom/A = pick(visible) visible_emote("suddenly stops and stares at something unseen[istype(A) ? " near [A]":""].") - handle_flee_target() -/mob/living/simple_animal/clockwork/proc/handle_flee_target() - //see if we should stop fleeing - if (flee_target && !(flee_target in ListTargets(view_range))) - flee_target = null - GiveUpMoving() - - if (flee_target && !stat && !buckled) - if (resting) - lay_down() - if(prob(25)) say("HSSSSS") - stop_automated_movement = 1 - walk_away(src, flee_target, 7, 2) - -/mob/living/simple_animal/clockwork/react_to_attack(var/atom/A) - if(A == src) return - flee_target = A - turns_since_scan = 5 - -/mob/living/simple_animal/clockwork/ex_act() - . = ..() - react_to_attack(src.loc) - //Basic friend AI /*/mob/living/simple_animal/clockwork/fluff var/mob/living/carbon/human/friend @@ -108,9 +79,9 @@ else if (prob(5)) visible_emote(pick("nuzzles [friend].", - "brushes against [friend].", - "rubs against [friend].", - "purrs.")) + "brushes against [friend].", + "rubs against [friend].", + "purrs.")) else if (friend.health <= 50) if (prob(10)) var/verb = pick("meows", "mews", "mrowls") @@ -118,7 +89,7 @@ /mob/living/simple_animal/cat/fluff/verb/become_friends() set name = "Become Friends" - set category = "Abilities.General" //CHOMPEdit + set category = "Abilities.General set src in view(1) if(!friend) @@ -132,21 +103,21 @@ if(.) set_dir(get_dir(src, friend)) visible_emote(pick("nuzzles [friend].", - "brushes against [friend].", - "rubs against [friend].", - "purrs.")) + "brushes against [friend].", + "rubs against [friend].", + "purrs.")) else usr << span_notice("[src] ignores you.") return */ -/mob/living/simple_animal/clockwork/fluff/Ignis +/mob/living/simple_mob/clockwork/fluff/Ignis name = "Ignis" desc = "The stalwart apparition of a clockwork flame guardian. This one appears to be to be have been somehow modified to be 'docile', it's living fire turned blue." - tt_desc = "Aeterna flamma armis" //Chaplains new pet! +// tt_desc = "Aeterna flamma armis" //Chaplains new pet! icon = 'icons/mob/clockwork_mobs.dmi' icon_state = "ignis" item_state = "ignis" - icon_living = "ignis" - icon_dead = "fallen_armor" - icon_rest = "ignis" - retaliate = 1 // In theory this will make Ignis fight back. Maybe. -RF +// icon_living = "ignis" +// icon_dead = "fallen_armor" +// icon_rest = "ignis" +// retaliate = 1 // In theory this will make Ignis fight back. Maybe. -RF diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm index d6f8187744..a12cc7d2b1 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm @@ -11,8 +11,10 @@ TODO: Make them light up and heat the air when exposed to oxygen. */ /datum/category_item/catalogue/fauna/gaslamp //TODO: VIRGO_LORE_WRITING_WIP + // CHOMPEdit Start name = "Frosted Gaslamp" desc = "A light floating medusola life form, not an endemic specimen to Sif but throughout illegal handling and DNA modification for the production of nitrogen, it is now found as an invasive specimen on sections around planet Sif." + // CHOMPEdit End value = CATALOGUER_REWARD_TRIVIAL /mob/living/simple_mob/animal/passive/gaslamp @@ -109,3 +111,41 @@ TODO: Make them light up and heat the air when exposed to oxygen. "Light occasionally filters down through the gaslamp’s various membranes, but it is becoming hard to notice, your eyelids feeling leaden, weighed down as the looming creature comes ever closer to claiming you!", "The gaslamp’s rhythmically undulating innards abruptly squish and massage down into your curled-up body, each squeeze bringing another brief increase to the heat already sinking deep into you... making it harder to tell where you end, and it begins!", "Every moment longer spent trapped within the gaslamp drains evermore energy out of you, squelching away your will to resist its possessive advances… and as its innards force submission into you, the swell you make visibly softens away!") + +/mob/living/simple_mob/animal/passive/gaslamp/snow //Frostlamnp + name = "Frostlit Lamp" + desc = "Some sort of floaty alien with a surprisingly warm glow. This creature is looks like an evolutionary offshute of the Gaslamp family." + tt_desc = "Semaeostomeae virginus" + icon = 'icons/mob/vore32x64.dmi' + icon_state = "gaslamp_snow" + icon_living = "gaslamp_snow" + icon_dead = "gaslamp_snow-dead" + + faction = "virgo3b" + maxHealth = 100 + health = 100 + movement_cooldown = 12 + + say_list_type = /datum/say_list/gaslamp + ai_holder_type = /datum/ai_holder/simple_mob/gaslamp + + melee_damage_lower = 5 + melee_damage_upper = 10 + attacktext = list("thrashed") + friendly = "caressed" + + response_help = "brushes" // If clicked on help intent + response_disarm = "pushes" // If clicked on disarm intent + response_harm = "swats" // If clicked on harm intent + + minbodytemp = 0 + maxbodytemp = 350 + + min_oxy = 1 //Needs Oxy to survive on cryogaia + max_oxy = 0 // Hopefully no Max oxy + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm index c2cd291252..c43370ca57 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm @@ -28,7 +28,7 @@ meat_type = /obj/item/reagent_containers/food/snacks/meat/chicken meat_amount = 3 - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /datum/say_list/goose speak = list("HONK!") @@ -58,3 +58,27 @@ icon_dead = "whitegoose_dead" name = "white goose" desc = "And just when you thought it was a lovely day..." + +/mob/living/simple_mob/animal/space/goose/domesticated + name = "domesticated goose" + desc = "It's a domesticated goose. It still looks pretty angry." + faction = "neutral" //Mess with this and the goose will eat anyones face, will eat other factions faces, appropiate considering its a hellbird - Jack + + can_be_drop_prey = TRUE + +/mob/living/simple_mob/animal/space/goose/domesticated/casino + name = "Donella" + desc = "It's a golden goose named Donella, she is a beloved treasure of the golden goose casino, nobody knows where she comes from." + icon_state = "golden_goose" + icon_living = "golden_goose" + icon_dead = "golden_goose_dead" + icon = 'icons/mob/animal.dmi' + + faction = "neutral" //Mess with this and the goose will eat anyones face, will eat other factions faces, appropiate considering its a hellbird - Jack + + maxHealth = 75 + health = 75 + + harm_intent_damage = 10 + melee_damage_lower = 10 + melee_damage_upper = 10 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose_ch.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose_ch.dm deleted file mode 100644 index 45ae026b7a..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose_ch.dm +++ /dev/null @@ -1,23 +0,0 @@ -/mob/living/simple_mob/animal/space/goose/domesticated - name = "domesticated goose" - desc = "It's a domesticated goose. It still looks pretty angry." - faction = "neutral" //Mess with this and the goose will eat anyones face, will eat other factions faces, appropiate considering its a hellbird - Jack - - can_be_drop_prey = TRUE //CHOMP Add - -/mob/living/simple_mob/animal/space/goose/domesticated/casino - name = "Donella" - desc = "It's a golden goose named Donella, she is a beloved treasure of the golden goose casino, nobody knows where she comes from." - icon_state = "golden_goose" - icon_living = "golden_goose" - icon_dead = "golden_goose_dead" - icon = 'modular_chomp/icons/mob/animal_ch.dmi' - - faction = "neutral" //Mess with this and the goose will eat anyones face, will eat other factions faces, appropiate considering its a hellbird - Jack - - maxHealth = 75 - health = 75 - - harm_intent_damage = 10 - melee_damage_lower = 10 - melee_damage_upper = 10 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/mouse_army_ch.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/mouse_army.dm similarity index 96% rename from code/modules/mob/living/simple_mob/subtypes/animal/space/mouse_army_ch.dm rename to code/modules/mob/living/simple_mob/subtypes/animal/space/mouse_army.dm index 5a0a89efa2..8add800d27 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/mouse_army_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/mouse_army.dm @@ -3,7 +3,7 @@ real_name = "mouse" desc = "It's a small militarized rodent." tt_desc = "E Mus musculus" - icon = 'modular_chomp/icons/mob/animal_ch.dmi' + icon = 'icons/mob/mouse_army.dmi' icon_state = "mouse_gray" item_state = "mouse_gray" icon_living = "mouse_gray" @@ -63,16 +63,16 @@ var/rank //pyro, operative, ammo, stealth. more to come. Do not leave blank. - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE species_sounds = "Mouse" - pain_emote_1p = list("squeak", "squik") // CHOMP Addition: Pain/etc sounds - pain_emote_1p = list("squeaks", "squiks") // CHOMP Addition: Pain/etc sounds + pain_emote_1p = list("squeak", "squik") + pain_emote_1p = list("squeaks", "squiks") /mob/living/simple_mob/animal/space/mouse_army/Initialize(mapload) . = ..() - add_verb(src,/mob/living/proc/ventcrawl) //CHOMPEdit TGPanel - add_verb(src,/mob/living/proc/hide) //CHOMPEdit TGPanel + add_verb(src,/mob/living/proc/ventcrawl) + add_verb(src,/mob/living/proc/hide) if(name == initial(name)) name = "[name] ([rand(1, 1000)])" @@ -363,7 +363,7 @@ name = "\improper Whisker Tank" desc = "A shockingly functional, miniaturized tank. Its inventor is unknown, but widely reviled." catalogue_data = list(/datum/category_item/catalogue/technology/mouse_tank) - icon = 'modular_chomp/icons/mob/animal_ch.dmi' + icon = 'icons/mob/mouse_army.dmi' icon_state = "whisker" wreckage = /obj/structure/loot_pile/mecha/mouse_tank faction = "mouse_army" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/ray.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/ray.dm index e1ccd7e7fb..1a1b67cbba 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/ray.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/ray.dm @@ -69,7 +69,7 @@ if(isliving(A)) var/mob/living/L = A if(prob(knockdown_chance)) - L.add_modifier(/datum/modifier/entangled, 4 SECONDS) //CHOMPedit, replacing weaken/slowdown with slow down + L.add_modifier(/datum/modifier/entangled, 4 SECONDS) // replacing weaken/slowdown with slow down L.visible_message(span_danger("\The [src] buffets \the [L]!")) src.ai_holder.remove_target() L.visible_message(span_notice("\The [src] seems to lose interest in \the [L]...")) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/shark.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/shark.dm index 3e0b6a31df..2ed7bab887 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/shark.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/shark.dm @@ -49,7 +49,7 @@ if(isliving(A)) var/mob/living/L = A if(prob(knockdown_chance)) - L.add_modifier(/datum/modifier/entangled, 4 SECONDS) //CHOMPedit, replacing weaken/slowdown with slow down + L.add_modifier(/datum/modifier/entangled, 4 SECONDS) // replacing weaken/slowdown with slow down L.visible_message(span_danger("\The [src] knocks down \the [L]!")) /mob/living/simple_mob/animal/space/shark/event diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm index d8a7839768..389a4222c8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm @@ -23,9 +23,10 @@ tt_desc = "E Reptilia Serpentes" catalogue_data = list(/datum/category_item/catalogue/fauna/snake) - icon_state = "green" - icon_living = "green" - icon_dead = "green_dead" + icon_state = "snek" + icon_living = "snek" + icon_dead = "snek_dead" + icon_rest = "snek_rest" icon = 'icons/mob/snake_vr.dmi' maxHealth = 15 @@ -47,24 +48,11 @@ say_list_type = /datum/say_list/snake ai_holder_type = /datum/ai_holder/simple_mob/passive - // CHOMPEdit Start - New sprites & Added vore - /* - icon_state = "python" - icon_living = "python" - icon_dead = "python_dead" - icon = 'icons/mob/snake_vr.dmi' - */ - icon_state = "snek" - icon_living = "snek" - icon_dead = "snek_dead" - icon_rest = "snek_rest" - icon = 'modular_chomp/icons/mob/animal_ch.dmi' - // CHOMPEdit End vore_active = 1 vore_capacity = 1 vore_default_mode = DM_DIGEST - vore_icons = SA_ICON_LIVING | SA_ICON_REST // CHOMPEdit + vore_icons = SA_ICON_LIVING | SA_ICON_REST vore_escape_chance = 20 swallowTime = 50 vore_bump_chance = 10 @@ -120,7 +108,7 @@ icon_state = "red" icon_living = "red" icon_dead = "red_dead" - icon = 'icons/mob/snake_vr.dmi' // CHOMP Comment: Whenever the red snake sprites, this needs to be changed. I swear someone made sprites for this. + icon = 'icons/mob/snake_vr.dmi' /* * Python @@ -130,6 +118,11 @@ desc = "A big, thick snake." tt_desc = "E Reptilia Pythonidae" + icon_state = "python" + icon_living = "python" + icon_dead = "python_dead" + icon = 'icons/mob/snake_vr.dmi' + /* * NOODLE IS HERE! SQUEEEEEEEE~ */ diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm index ef299b9ce3..c3f04429c4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm @@ -59,7 +59,7 @@ var/maw_cooldown = 30 SECONDS var/open_maw = FALSE // Are we trying to eat things? - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/animal/space/space_worm/head name = "space worm" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm b/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm index 96c8303155..1f3593e913 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm @@ -50,7 +50,7 @@ var/static/list/overlays_cache = list() var/do_seasons = TRUE - picked_color = FALSE //CHOMPedit: removed "var/" since we already have this defined for all simple_mobs. + picked_color = FALSE allow_mind_transfer = TRUE @@ -75,7 +75,6 @@ B.name = "stomach" B.digest_mode = DM_SELECT B.mode_flags = DM_FLAG_THICKBELLY -// B.belly_fullscreen = "yet_another_tumby" //Chompedit - Belly Fullscreen change B.digest_brute = 1 B.digest_burn = 1 B.escapechance = 35 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/vox.dm b/code/modules/mob/living/simple_mob/subtypes/animal/vox.dm index 2a034f191d..f9ac37507c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/vox.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/vox.dm @@ -8,11 +8,9 @@ min_n2 = 0 //breathe N2 max_n2 = 0 - // CHOMPAdd: Pain sounds species_sounds = "Vox" pain_emote_1p = list("shriek") pain_emote_3p = list("shrieks") - // CHOMPAdd End /mob/living/simple_mob/vox/armalis name = "serpentine alien" @@ -29,7 +27,6 @@ melee_damage_upper = 40 attacktext = "slammed its enormous claws into" movement_cooldown = 2 -// environment_smash_flags = SMASH_LIGHT_STRUCTURES | SMASH_CONTAINERS | SMASH_WALLS // WALLS Temporary commenting, YW - Hv3 attack_sound = 'sound/weapons/bladeslice.ogg' status_flags = 0 max_oxy = 0 diff --git a/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm b/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm index 36a36dc735..757b8034e5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm +++ b/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm @@ -263,7 +263,7 @@ /obj/item/projectile/beam/mouselaser/ddraig/spawn_mob(var/mob/living/target) var/list/tf_list = list(/mob/living/simple_mob/animal/passive/mouse, - /mob/living/simple_mob/animal/passive/mouse/rat/strong, // CHOMPEdit + /mob/living/simple_mob/animal/passive/mouse/rat/strong, /mob/living/simple_mob/vore/alienanimals/dustjumper, /mob/living/simple_mob/vore/woof, /mob/living/simple_mob/animal/passive/dog/corgi, diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm b/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm index 339a6ad606..e31ef5e512 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm @@ -4,7 +4,7 @@ icon = 'icons/mob/horror_show/GHPS.dmi' icon_gib = "generic_gib" - can_pain_emote = FALSE // CHOMPEdit: Can't feel pain + can_pain_emote = FALSE /datum/ai_holder/simple_mob/horror hostile = TRUE // The majority of simplemobs are hostile, gaslamps are nice. @@ -28,4 +28,4 @@ minbodytemp = 0 maxbodytemp = 700 - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/cultist_ch.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/cultist.dm similarity index 98% rename from code/modules/mob/living/simple_mob/subtypes/humanoid/cultist_ch.dm rename to code/modules/mob/living/simple_mob/subtypes/humanoid/cultist.dm index 27716d5980..581b143dc0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/cultist_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/cultist.dm @@ -36,7 +36,7 @@ name = "Cultist" desc = "An awfully frail and ghastly looking individual" tt_desc = "NULL" - icon = 'modular_chomp/icons/mob/animal_ch.dmi' + icon = 'icons/mob/cultists.dmi' icon_state = "initiate" faction = "cult" mob_class = MOB_CLASS_DEMONIC @@ -135,7 +135,7 @@ visible_message(span_danger("\The [src] suddenly rises from a pool of blood \the [L]!")) new /obj/effect/decal/cleanable/blood (src.loc) playsound(L, 'sound/weapons/heavysmash.ogg', 75, 1) - L.add_modifier(/datum/modifier/entangled, 1 SECONDS) //L.Weaken(3) CHOMPedit: Trying to remove hardstuns, replacing it with slow down + L.add_modifier(/datum/modifier/entangled, 1 SECONDS) overshoot = FALSE if(!overshoot) // We hit the target, or something, at destination, so we're done. @@ -643,7 +643,7 @@ base_attack_cooldown = 7.5 - loot_list = list(/obj/item/material/butterfly/saw = 100, /obj/item/gun/projectile/shotgun/doublebarrel/sawn/alt = 100) + // loot_list = list(/obj/item/material/butterfly/saw = 100, /obj/item/gun/projectile/shotgun/doublebarrel/sawn/alt = 100) // Downstream needs_reload = TRUE reload_max = 2 diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid.dm index cf28af0692..b29d784fd6 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid.dm @@ -24,14 +24,14 @@ species_sounds = "Human Male" // Yes, we should allow them to differ based on gender, but if someone's making a custom humanoid later:tm: - set your humanoid's species_sounds to match, or var-edit it after spawn. - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/humanoid/death() ..() if(corpse) - var/mob/new_corpse = new corpse(src.loc) //CHOMPEdit - if(istype(new_corpse)) //CHOMPEdit - new_corpse.low_priority = TRUE //CHOMPEdit + var/mob/new_corpse = new corpse(src.loc) + if(istype(new_corpse)) + new_corpse.low_priority = TRUE qdel(src) return diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid_ch.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid_ch.dm deleted file mode 100644 index aea8983bb7..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid_ch.dm +++ /dev/null @@ -1,5 +0,0 @@ -// Basically, all we're doing here (for now) is defining pain/etc sounds for combat use -/mob/living/simple_mob/humanoid - pain_emote_1p = list("shout out in pain", "growl in pain", "grunt in pain", "gasp out in pain") - pain_emote_3p = list("shouts out in pain", "growls in pain", "grunts in pain", "gasps out in pain") - species_sounds = "Human Male" // Yes, we should allow them to differ based on gender, but if someone's making a custom humanoid later:tm: - set your humanoid's species_sounds to match, or var-edit it after spawn. diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm index 8f2f2667e6..76ed515b99 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm @@ -5,12 +5,13 @@ // Probably shouldn't use this directly, there are a bunch of sub-classes that are more complete. /mob/living/simple_mob/humanoid/merc name = "mercenary" - tt_desc = "E Homo sapiens" desc = "A tough looking individual armed with only a knife." //CHOMPEdit + tt_desc = "E Homo sapiens" icon_state = "syndicate" icon_living = "syndicate" icon_dead = "syndicate_dead" icon_gib = "syndicate_gib" + icon= 'icons/mob/mercenaries.dmi' faction = FACTION_SYNDICATE movement_cooldown = 1 @@ -24,7 +25,8 @@ harm_intent_damage = 5 melee_damage_lower = 15 //Tac Knife damage melee_damage_upper = 15 - attack_sharp = 1 //CHOMPEdit + attack_armor_pen = 20 + attack_sharp = TRUE attack_edge = 1 attacktext = list("slashed", "stabbed") armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 100) // Same armor values as the vest they drop, plus simple mob immunities @@ -37,12 +39,11 @@ // Grenade special attack vars var/grenade_type = /obj/item/grenade/concussion - var/grenade_timer = 50 //CHOMPEdit special_attack_cooldown = 45 SECONDS + var/grenade_timer = 50 special_attack_min_range = 2 special_attack_max_range = 7 - //////////////////////////////// // Grenade Attack //////////////////////////////// @@ -72,8 +73,8 @@ 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 + G.det_time = grenade_timer + G.activate(src) special_attack_charges = max(special_attack_charges-1, 0) set_AI_busy(FALSE) @@ -124,7 +125,7 @@ melee_damage_lower = 30 melee_damage_upper = 30 attack_armor_pen = 50 - attack_sharp = 1 //CHOMPEdit + attack_sharp = TRUE attack_edge = 1 attacktext = list("slashed") @@ -161,6 +162,7 @@ // Base Ranged Merc, so we don't have to redefine a million vars for every subtype. Uses a pistol. /mob/living/simple_mob/humanoid/merc/ranged + desc = "A tough looking individual armed with an pistol." icon_state = "syndicateranged" icon_living = "syndicateranged" projectiletype = /obj/item/projectile/bullet/pistol/medium @@ -174,6 +176,8 @@ // C20r SMG /mob/living/simple_mob/humanoid/merc/ranged/smg + name = "mercenary soldier" + desc = "A tough looking individual armed with an submachine gun." icon_state = "syndicateranged_smg" icon_living = "syndicateranged_smg" projectiletype = /obj/item/projectile/bullet/a10mm //CHOMPedit, 20 instead of 35, SMG @@ -194,6 +198,7 @@ base_attack_cooldown = 5 // Two attacks a second or so. reload_max = 20 + catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/human/peacekeeper) // Rifles /mob/living/simple_mob/humanoid/merc/ranged/rifle @@ -211,16 +216,20 @@ /mob/living/simple_mob/humanoid/merc/ranged/rifle/mag loot_list = list(/obj/item/gun/magnetic/railgun/flechette = 100) - projectiletype = /obj/item/projectile/bullet/magnetic/flechette/rapid // Who thought rapid fire 20 damage with 100% armor pen was a good idea? CH edit + projectiletype = /obj/item/projectile/bullet/magnetic/flechette/rapid // CHOMPEdit Who thought rapid fire 20 damage with 100% armor pen was a good idea? projectilesound = 'sound/weapons/rapidslice.ogg' + // CHOMPAdd Start projectile_dispersion = 5 projectile_accuracy = -20 base_attack_cooldown = 15 + // CHOMPAdd End reload_max = 10 // Laser Rifle /mob/living/simple_mob/humanoid/merc/ranged/laser + name = "mercenary marksman" + desc = "A tough looking individual armed with an laser rifle." icon_state = "syndicateranged_laser" icon_living = "syndicateranged_laser" projectiletype = /obj/item/projectile/beam/midlaser @@ -234,6 +243,8 @@ // Ion Rifle /mob/living/simple_mob/humanoid/merc/ranged/ionrifle + name = "mercenary anti-technical" + desc = "A tough looking individual armed with an ion rifle." icon_state = "syndicateranged_ionrifle" icon_living = "syndicateranged_ionrifle" projectiletype = /obj/item/projectile/ion @@ -245,6 +256,9 @@ // Grenadier, Basically a miniboss /mob/living/simple_mob/humanoid/merc/ranged/grenadier + name = "mercenary grenadier" + desc = "A tough looking individual armed with a shotgun and a belt of grenades." + catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/human/grenadier) icon_state = "syndicateranged_shotgun" icon_living = "syndicateranged_shotgun" projectiletype = /obj/item/projectile/bullet/pellet/shotgun // Buckshot @@ -297,7 +311,7 @@ ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/sniper - ranged_attack_delay = 2.5 SECONDS // CHOMPStation Removal: Ranged attack delay is stupid.//CHOMPStation ReRemoval: Instant kill hitscan is stupid. + ranged_attack_delay = 2.5 SECONDS loot_list = list(/obj/item/sniper_rifle_part/barrel = 50, /obj/item/sniper_rifle_part/stock = 50, @@ -362,15 +376,41 @@ return TRUE +//Garand +/mob/living/simple_mob/humanoid/merc/ranged/garand + name = "mercenary rifleman" + desc = "A tough looking individual armed with a semiautomatic rifle." + icon_state = "syndicateranged_veteran" + icon_living = "syndicateranged_veteran" + projectiletype = /obj/item/projectile/bullet/rifle/a762 + projectilesound = 'sound/weapons/Gunshot_heavy.ogg' + loot_list = list(/obj/item/gun/projectile/garand = 100) + reload_max = 8 + reload_time = 2 // It takes a bit to jam a stripper clip into the rifle. + +//Hand Cannon +/mob/living/simple_mob/humanoid/merc/ranged/deagle + name = "mercenary officer" + desc = "A tough looking individual armed with an handcannon." + icon_state = "syndicate_handcannon" + icon_living = "syndicate_handcannon" + projectiletype = /obj/item/projectile/bullet/pistol/strong + projectilesound = 'sound/weapons/Gunshot_deagle.ogg' + loot_list = list(/obj/item/gun/projectile/deagle = 100) + needs_reload = TRUE + reload_max = 7 // Deagle Reload + //////////////////////////////// // Space Mercs //////////////////////////////// // Sword Space Merc /mob/living/simple_mob/humanoid/merc/melee/sword/space - name = "syndicate commando" - icon_state = "syndicatemeleespace" - icon_living = "syndicatemeleespace" + name = "mercenary commando" + desc = "A tough looking individual, armred with an energy sword and shield." + icon_state = "syndicatespace-melee" + icon_living = "syndicatespace-melee" + catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/human/space) movement_cooldown = -1 @@ -393,9 +433,14 @@ // Ranged Space Merc /mob/living/simple_mob/humanoid/merc/ranged/space - name = "syndicate sommando" - icon_state = "syndicaterangedpsace" - icon_living = "syndicaterangedpsace" + name = "armored mercenary" + desc = "A tough looking individual, armed with a submachine gun." + icon_state = "syndicatespace-ranged" + icon_living = "syndicatespceace-ranged" + armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 100) // Same armor as their voidsuit. + base_attack_cooldown = 5 // Two attacks a second or so. + reload_max = 20 + loot_list = list(/obj/item/gun/projectile/automatic/c20r = 100) movement_cooldown = -1 @@ -414,6 +459,119 @@ corpse = /obj/effect/landmark/mobcorpse/syndicatecommando +//Combat Shotgun Merc +/mob/living/simple_mob/humanoid/merc/ranged/space/shotgun + name = "mercenary tactical" + desc = "A tough looking individual armed with a combat shotgun." + icon_state = "syndicatespace-shotgun" + icon_living = "syndicatespace-shotgun" + base_attack_cooldown = 10 + reload_max = 7 + reload_time = 2 SECONDS //Takes a While to load all those shells. + projectiletype = /obj/item/projectile/bullet/pellet/shotgun // Buckshot + projectilesound = 'sound/weapons/Gunshot_shotgun.ogg' + loot_list = list(/obj/item/gun/projectile/shotgun/pump/combat = 100) + +//Auto-Shotgun Space Merc +/mob/living/simple_mob/humanoid/merc/ranged/space/shotgun/auto + name = "mercenary sweeper" + desc = "A tough looking individual armed with an automatic shotgun." + icon_state = "syndicatespace-ashotgun" + icon_living = "syndicatespace-ashotgun" + base_attack_cooldown = 5 // Two attacks a second or so. + reload_max = 24 + projectiletype = /obj/item/projectile/bullet/pellet/shotgun // Buckshot + projectilesound = 'sound/weapons/Gunshot_shotgun.ogg' + loot_list = list(/obj/item/gun/projectile/automatic/as24 = 100) + ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/suppressor + +//Machine Gun Merc +/mob/living/simple_mob/humanoid/merc/ranged/space/heavy + name = "mercenary heavy gunner" + desc = "A tough looking individual armed with an light machinegun." + icon_state = "syndicatespace-heavy" + icon_living = "syndicatespace-heavy" + base_attack_cooldown = 2.5 // Four Attacks a Second. MOAR DAKKA + reload_max = 50 + projectiletype = /obj/item/projectile/bullet/rifle/a545 + projectilesound = 'sound/weapons/Gunshot_light.ogg' + loot_list = list(/obj/item/gun/projectile/automatic/l6_saw = 100) + ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/suppressor + +//Tommy-Las Merc +/mob/living/simple_mob/humanoid/merc/ranged/space/tommylas + name = "mercenary light burster" + desc = "A tough looking individual armed with an automatic laser." + icon_state = "syndicatespace-tommylas" + icon_living = "syndicatespace-tommylas" + base_attack_cooldown = 2.5 // Four Attacks a Second. MOAR DAKKA + reload_max = 3 + reload_time = 0.5 // Meant to Simulate controlled Supressive Bursts + projectiletype = /obj/item/projectile/beam/weaklaser + projectilesound = 'sound/weapons/Laser.ogg' + // loot_list = list(/obj/item/gun/energy/tommylaser = 100) // Downstream + ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/suppressor + +/mob/living/simple_mob/humanoid/merc/ranged/space/fal + name = "mercenary commando" + desc = "A tough looking individual armed with a assault rifle." + icon_state = "syndicatespace-commando" + icon_living = "syndicatespace-commando" + projectiletype = /obj/item/projectile/bullet/rifle/a762 + projectilesound = 'sound/weapons/Gunshot_heavy.ogg' + // loot_list = list(/obj/item/gun/projectile/automatic/fal = 100)// Downstream + reload_max = 20 + +/mob/living/simple_mob/humanoid/merc/ranged/space/suppressor // adminspawn only, and also Probably Going To Kill The Unprepared + name = "mercenary suppressor" + desc = "Geeze, weren't shotgun ops bad enough? At least when you fade these jerks you get a flashbang to the face." + icon_state = "syndi-ranged-space-sup" + icon_living = "syndi-ranged-space-sup" + armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 100) // this is the merc rig's stats + ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/suppressor + say_list_type = /datum/say_list/merc/elite + projectiletype = /obj/item/projectile/bullet/pistol/medium/ap/suppressor // it's high velocity + projectilesound = 'sound/weapons/doompistol.ogg' // converted from .wavs extracted from doom 2 + base_attack_cooldown = 3 // three? attacks a second + reload_max = 30 // extended mags + special_attack_charges = 5 + loot_list = list() // oh, you killed him? + corpse = null // well, sorry, buddy, he doesn't drop shit + catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/human/space/suppressor) + +/mob/living/simple_mob/humanoid/merc/ranged/space/suppressor/elite // really reconsider why you're spawning this dude + name = "mercenary elite suppressor" + desc = "Geeze, weren't normal suppressors bad enough? At least if you fade this jerk, you'll have an awful time anyway." + icon_state = "syndi-ranged-space-sup-elite" + icon_living = "syndi-ranged-space-sup-elite" + armor = list(melee = 80, bullet = 70, laser = 55, energy = 15, bomb = 80, bio = 100, rad = 100) // see code for military hardsuit + projectiletype = /obj/item/projectile/bullet/pistol/medium/ap/suppressor/turbo // fuck it, fast bullets + grenade_type = /obj/item/grenade/shooter/rubber // don't group up + grenade_timer = 30 // well, look what you've done, you've grouped up + +// being Actual Professionals, they have better (read: player-level) blocking chances +/mob/living/simple_mob/humanoid/merc/ranged/space/suppressor/attackby(var/obj/item/O, var/mob/user) + if(O.force) + if(prob(50)) + visible_message(span_danger("\The [src] blocks \the [O] with its shield!")) + if(user) + ai_holder.react_to_attack(user) + return + else + ..() + else + visible_message(span_warning("\The [user] gently taps [src] with \the [O].")) + +/mob/living/simple_mob/humanoid/merc/ranged/space/suppressor/bullet_act(var/obj/item/projectile/Proj) + if(!Proj) return + if(prob(50)) + visible_message(span_warning("[src] blocks [Proj] with its shield!")) + if(Proj.firer) + ai_holder.react_to_attack(Proj.firer) + return + else + ..() + /mob/living/simple_mob/humanoid/merc/ranged/space/Process_Spacemove(var/check_drift = 0) return diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_ch.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_ch.dm deleted file mode 100644 index 19a1124a36..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_ch.dm +++ /dev/null @@ -1,517 +0,0 @@ -/datum/category_item/catalogue/fauna/mercenary - name = "Mercenaries" - desc = "Life on the Frontier is hard, and unregulated. Unlike life in \ - more 'civlized' areas of the Galaxy, violence and piracy remain common \ - this far out. The Megacorporations keep a tight grip on their holdings, \ - but there are always small bands or aspiring companies looking to make a \ - thaler. From simple pirates to legitimate PMCs, Frontier mercs come in \ - all shapes and sizes." - value = CATALOGUER_REWARD_TRIVIAL - unlocked_by_any = list(/datum/category_item/catalogue/fauna/mercenary) - -// Obtained by scanning all X. -/datum/category_item/catalogue/fauna/all_mercenaries - name = "Collection - Mercenaries" - desc = "You have scanned a large array of different types of mercenary, \ - and therefore you have been granted a large sum of points, through this \ - entry." - value = CATALOGUER_REWARD_HARD - unlocked_by_all = list( - /datum/category_item/catalogue/fauna/mercenary/human, - /datum/category_item/catalogue/fauna/mercenary/human/peacekeeper, - /datum/category_item/catalogue/fauna/mercenary/human/grenadier, - /datum/category_item/catalogue/fauna/mercenary/human/space, - /datum/category_item/catalogue/fauna/mercenary/human/space/suppressor, - /datum/category_item/catalogue/fauna/mercenary/vox, - /datum/category_item/catalogue/fauna/mercenary/vox/boarder, - /datum/category_item/catalogue/fauna/mercenary/vox/technician, - /datum/category_item/catalogue/fauna/mercenary/vox/suppressor, - /datum/category_item/catalogue/fauna/mercenary/vox/captain - ) - -/datum/category_item/catalogue/fauna/mercenary/human - name = "Mercenaries - Human" - desc = "Human Mercenary bands are extremely common on the Frontier. Many \ - of the modern outfits operating on the fringe today are veterans of the \ - Phoron Wars. After the dissolution of the Syndicate, these operatives were \ - left without a place to call home. Those who have survived have leveraged \ - their experience into a viable trade." - value = CATALOGUER_REWARD_EASY - -/datum/category_item/catalogue/fauna/mercenary/human/peacekeeper - name = "Mercenaries - Solar Peacekeeper" - desc = "Activist groups in Civlized Space often raise moral concerns about \ - conditions on the Frontier. The more organized groups will sometimes gather \ - bands of mercenaries from the core worlds together under the belief that they \ - can come out to the Frontier to enforce their way of life. Due to the Frontier \ - Act, these 'humanitarian operations' are quickly demolished." - value = CATALOGUER_REWARD_EASY - -/datum/category_item/catalogue/fauna/mercenary/human/grenadier - name = "Mercenaries - Grenadier" - desc = "After the Phoron Wars, many deniable operatives on both sides of \ - the conflict found that there was no place for them within their home companies \ - any more. Left without options, these highly motivated and trained specialists \ - often seek revenge, or attempt to carve out their own fiefdoms. Well equipped \ - and well trained, these outcasts are not to be taken lightly." - value = CATALOGUER_REWARD_EASY - -/datum/category_item/catalogue/fauna/mercenary/human/space - name = "Mercenaries - Commando" - desc = "Commandos, much like their less equipped brethren, are experts in \ - wet work. Honing their skills over years of training, the Commando's iconic \ - equipment summons memories of the bad old days in any survivor who sees them. \ - These mercs make a statement with their equipment - 'I was there. Come get me.' \ - It is usually not an idle boast." - value = CATALOGUER_REWARD_EASY - -/mob/living/simple_mob/humanoid/merc - icon = 'modular_chomp/icons/mob/animal_ch.dmi' - catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/human) - -/mob/living/simple_mob/humanoid/merc/Initialize(mapload) - . = ..() - loot_list += list(/obj/item/salvage/loot/syndicate = 10) - -/mob/living/simple_mob/humanoid/merc/ranged - desc = "A tough looking individual armed with an pistol." - -/mob/living/simple_mob/humanoid/merc/ranged/smg - name = "mercenary soldier" - desc = "A tough looking individual armed with an submachine gun." - -/mob/living/simple_mob/humanoid/merc/ranged/smg/sol - catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/human/peacekeeper) - -/mob/living/simple_mob/humanoid/merc/ranged/laser - name = "mercenary marksman" - desc = "A tough looking individual armed with an laser rifle." - -/mob/living/simple_mob/humanoid/merc/ranged/ionrifle - name = "mercenary anti-technical" - desc = "A tough looking individual armed with an ion rifle." - - -//Garand -/mob/living/simple_mob/humanoid/merc/ranged/garand - name = "mercenary rifleman" - desc = "A tough looking individual armed with a semiautomatic rifle." - icon_state = "syndicateranged_veteran" - icon_living = "syndicateranged_veteran" - projectiletype = /obj/item/projectile/bullet/rifle/a762 - projectilesound = 'sound/weapons/Gunshot_heavy.ogg' - loot_list = list(/obj/item/gun/projectile/garand = 100) - reload_max = 8 - reload_time = 2 // It takes a bit to jam a stripper clip into the rifle. - -//Hand Cannon -/mob/living/simple_mob/humanoid/merc/ranged/deagle - name = "mercenary officer" - desc = "A tough looking individual armed with an handcannon." - icon_state = "syndicate_handcannon" - icon_living = "syndicate_handcannon" - projectiletype = /obj/item/projectile/bullet/pistol/strong - projectilesound = 'sound/weapons/Gunshot_deagle.ogg' - loot_list = list(/obj/item/gun/projectile/deagle = 100) - needs_reload = TRUE - reload_max = 7 // Deagle Reload - -/mob/living/simple_mob/humanoid/merc/ranged/grenadier - name = "mercenary grenadier" - desc = "A tough looking individual armed with a shotgun and a belt of grenades." - catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/human/grenadier) - -/mob/living/simple_mob/humanoid/merc/melee/sword/space - name = "mercenary commando" - desc = "A tough looking individual, armred with an energy sword and shield." - icon_state = "syndicatespace-melee" - icon_living = "syndicatespace-melee" - catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/human/space) - -/mob/living/simple_mob/humanoid/merc/ranged/space - name = "armored mercenary" - desc = "A tough looking individual, armed with a submachine gun." - icon_state = "syndicatespace-ranged" - icon_living = "syndicatespceace-ranged" - armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 100) // Same armor as their voidsuit. - base_attack_cooldown = 5 // Two attacks a second or so. - reload_max = 20 - loot_list = list(/obj/item/gun/projectile/automatic/c20r = 100) - -//Combat Shotgun Merc -/mob/living/simple_mob/humanoid/merc/ranged/space/shotgun - name = "mercenary tactical" - desc = "A tough looking individual armed with a combat shotgun." - icon_state = "syndicatespace-shotgun" - icon_living = "syndicatespace-shotgun" - base_attack_cooldown = 10 - reload_max = 7 - reload_time = 2 SECONDS //Takes a While to load all those shells. - projectiletype = /obj/item/projectile/bullet/pellet/shotgun // Buckshot - projectilesound = 'sound/weapons/Gunshot_shotgun.ogg' - loot_list = list(/obj/item/gun/projectile/shotgun/pump/combat = 100) - -//Auto-Shotgun Space Merc -/mob/living/simple_mob/humanoid/merc/ranged/space/shotgun/auto - name = "mercenary sweeper" - desc = "A tough looking individual armed with an automatic shotgun." - icon_state = "syndicatespace-ashotgun" - icon_living = "syndicatespace-ashotgun" - base_attack_cooldown = 5 // Two attacks a second or so. - reload_max = 24 - projectiletype = /obj/item/projectile/bullet/pellet/shotgun // Buckshot - projectilesound = 'sound/weapons/Gunshot_shotgun.ogg' - loot_list = list(/obj/item/gun/projectile/automatic/as24 = 100) - ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/suppressor - -//Machine Gun Merc -/mob/living/simple_mob/humanoid/merc/ranged/space/heavy - name = "mercenary heavy gunner" - desc = "A tough looking individual armed with an light machinegun." - icon_state = "syndicatespace-heavy" - icon_living = "syndicatespace-heavy" - base_attack_cooldown = 2.5 // Four Attacks a Second. MOAR DAKKA - reload_max = 50 - projectiletype = /obj/item/projectile/bullet/rifle/a545 - projectilesound = 'sound/weapons/Gunshot_light.ogg' - loot_list = list(/obj/item/gun/projectile/automatic/l6_saw = 100) - ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/suppressor - -//Tommy-Las Merc -/mob/living/simple_mob/humanoid/merc/ranged/space/tommylas - name = "mercenary light burster" - desc = "A tough looking individual armed with an automatic laser." - icon_state = "syndicatespace-tommylas" - icon_living = "syndicatespace-tommylas" - base_attack_cooldown = 2.5 // Four Attacks a Second. MOAR DAKKA - reload_max = 3 - reload_time = 0.5 // Meant to Simulate controlled Supressive Bursts - projectiletype = /obj/item/projectile/beam/weaklaser - projectilesound = 'sound/weapons/Laser.ogg' - loot_list = list(/obj/item/gun/energy/tommylaser = 100) - ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/suppressor - -/mob/living/simple_mob/humanoid/merc/ranged/space/fal - name = "mercenary commando" - desc = "A tough looking individual armed with a assault rifle." - icon_state = "syndicatespace-commando" - icon_living = "syndicatespace-commando" - projectiletype = /obj/item/projectile/bullet/rifle/a762 - projectilesound = 'sound/weapons/Gunshot_heavy.ogg' - loot_list = list(/obj/item/gun/projectile/automatic/fal = 100) - reload_max = 20 - -// suppressors are just assholes and are intended to be a piss poor experience for everyone on both sides -/datum/category_item/catalogue/fauna/mercenary/human/space/suppressor - name = "Mercenaries - Suppressor" - desc = "Just because the Phoron Wars are over, it doesn't mean that covert \ - actions and corporate espionage ended too. When you encounter mercs with \ - the latest gear and the best training, you can bet your bottom Thaler that \ - they've got a Corporate sponsor backing them up." - value = CATALOGUER_REWARD_MEDIUM - -/datum/ai_holder/simple_mob/merc/ranged/suppressor - respect_alpha = FALSE // he really just shoots you - vision_range = 10 // plutonia experience - conserve_ammo = FALSE - -/mob/living/simple_mob/humanoid/merc/ranged/space/suppressor // adminspawn only, and also Probably Going To Kill The Unprepared - name = "mercenary suppressor" - desc = "Geeze, weren't shotgun ops bad enough? At least when you fade these jerks you get a flashbang to the face." - icon_state = "syndi-ranged-space-sup" - icon_living = "syndi-ranged-space-sup" - armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 100) // this is the merc rig's stats - ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/suppressor - say_list_type = /datum/say_list/merc/elite - projectiletype = /obj/item/projectile/bullet/pistol/medium/ap/suppressor // it's high velocity - projectilesound = 'sound/weapons/doompistol.ogg' // converted from .wavs extracted from doom 2 - base_attack_cooldown = 3 // three? attacks a second - reload_max = 30 // extended mags - special_attack_charges = 5 - loot_list = list() // oh, you killed him? - corpse = null // well, sorry, buddy, he doesn't drop shit - catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/human/space/suppressor) -// var/deathnade_path = /obj/item/grenade/flashbang/stingbang -/* far too fun for the codebase at the moment -/mob/living/simple_mob/humanoid/merc/ranged/space/suppressor/death() - // you thought killing him would be the least of your worries? - // think again - var/obj/item/grenade/banger = new deathnade_path(get_turf(src)) - banger.throw_at(ai_holder.target, 9, 9, null) - banger.det_time = 25 - banger.activate(null) - ..() -*/ -/mob/living/simple_mob/humanoid/merc/ranged/space/suppressor/elite // really reconsider why you're spawning this dude - name = "mercenary elite suppressor" - desc = "Geeze, weren't normal suppressors bad enough? At least if you fade this jerk, you'll have an awful time anyway." - icon_state = "syndi-ranged-space-sup-elite" - icon_living = "syndi-ranged-space-sup-elite" - armor = list(melee = 80, bullet = 70, laser = 55, energy = 15, bomb = 80, bio = 100, rad = 100) // see code for military hardsuit - projectiletype = /obj/item/projectile/bullet/pistol/medium/ap/suppressor/turbo // fuck it, fast bullets - grenade_type = /obj/item/grenade/shooter/rubber // don't group up - grenade_timer = 30 // well, look what you've done, you've grouped up -// deathnade_path = /obj/item/grenade/flashbang/stingbang/shredbang // REALLY don't group up -// being Actual Professionals, they have better (read: player-level) blocking chances -/mob/living/simple_mob/humanoid/merc/ranged/space/suppressor/attackby(var/obj/item/O, var/mob/user) - if(O.force) - if(prob(50)) - visible_message(span_danger("\The [src] blocks \the [O] with its shield!")) - if(user) - ai_holder.react_to_attack(user) - return - else - ..() - else - visible_message(span_warning("\The [user] gently taps [src] with \the [O].")) -/mob/living/simple_mob/humanoid/merc/ranged/space/suppressor/bullet_act(var/obj/item/projectile/Proj) - if(!Proj) return - if(prob(50)) - visible_message(span_warning("[src] blocks [Proj] with its shield!")) - if(Proj.firer) - ai_holder.react_to_attack(Proj.firer) - return - else - ..() - - - - - - -//////////////////////////////// -// Vox Pirates -//////////////////////////////// -//Classifying these as Mercs, due to the general power level I want them at. - -/datum/category_item/catalogue/fauna/mercenary/vox - name = "Mercenaries - Vox" - desc = "For centuries the Vox have inflicted their way of life upon the \ - Galaxy. Regarded with distrust due to their tendency to engage in piracy \ - and violence, the Vox are equally feared for their robust physiology and \ - curiously advanced xenotech. Due to ancient compacts, Vox pirates try to \ - avoid bloodshed, but will react to violence in kind." - value = CATALOGUER_REWARD_MEDIUM - unlocked_by_any = list(/datum/category_item/catalogue/fauna/mercenary/vox) - -/mob/living/simple_mob/humanoid/merc/voxpirate //Don't use this one. - name = "vox mannequin" - desc = "You shouldn't be seeing this one." - icon_state = "voxpirate" - icon_living = "voxpirate" - icon_dead = "voxpirate_dead" - - faction = "voxpirate" - movement_cooldown = 4 - - status_flags = 0 - - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" - - harm_intent_damage = 5 - melee_damage_lower = 20 //Vox Hunting rifle blade damage - melee_damage_upper = 20 - attack_sharp = 1 - attack_edge = 1 - attacktext = list("slashed", "stabbed") - armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 100) // Matching Merc voidsuit stats to represent toughness. - - min_oxy = 0 //Vox are spaceproof. - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - corpse = /obj/effect/landmark/mobcorpse/vox/pirate - loot_list = list(/obj/item/gun/projectile/shotgun/pump/rifle/vox_hunting = 100, - /obj/item/ammo_magazine/clip/c762 = 30, - /obj/item/ammo_magazine/clip/c762 = 30 - ) - - ai_holder_type = /datum/ai_holder/simple_mob/merc - say_list_type = /datum/say_list/merc/voxpirate - -/mob/living/simple_mob/humanoid/merc/voxpirate/pirate - name = "vox pirate" - desc = "A desperate looking Vox. Get your gun." - - projectiletype = /obj/item/projectile/bullet/rifle/a762 - projectilesound = 'sound/weapons/riflebolt.ogg' - needs_reload = TRUE - reload_max = 20 - -//////////////////////////////// -// Vox Melee -//////////////////////////////// - -/datum/category_item/catalogue/fauna/mercenary/vox/boarder - name = "Mercenaries - Vox Boarder" - desc = "Vox are squat creatures, with powerful muscles and tough, scaly \ - hides. Their dense bones and sharp talons make them a formidable threat in \ - close quarters combat. Low level Vox weaponry generally emphasizes closing \ - the distance to exploit these facts." - value = CATALOGUER_REWARD_MEDIUM - -/mob/living/simple_mob/humanoid/merc/voxpirate/boarder - name = "vox melee boarder" - desc = "A howling Vox with a sword. Run." - icon_state = "voxboarder_m" - icon_living = "voxboarder_m" - icon_dead = "voxboarder_m_dead" - catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/boarder) - - melee_damage_lower = 30 //Energy sword damage - melee_damage_upper = 30 - attack_sharp = 1 - attack_edge = 1 - - ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive - corpse = /obj/effect/landmark/mobcorpse/vox/boarder_m - loot_list = list(/obj/item/melee/energy/sword = 100) - -// They're good with the swords? I dunno. I like the idea they can deflect. -/mob/living/simple_mob/humanoid/merc/voxpirate/boarder/attackby(var/obj/item/O, var/mob/user) - if(O.force) - if(prob(20)) - visible_message(span_danger("\The [src] blocks \the [O] with its sword!")) - if(user) - ai_holder.react_to_attack(user) - return - else - ..() - else - to_chat(user, span_warning("This weapon is ineffective, it does no damage.")) - visible_message(span_warning("\The [user] gently taps [src] with \the [O].")) - -/mob/living/simple_mob/humanoid/merc/voxpirate/boarder/bullet_act(var/obj/item/projectile/Proj) - if(!Proj) return - if(prob(35)) - visible_message(span_warning("[src] blocks [Proj] with its sword!")) - if(Proj.firer) - ai_holder.react_to_attack(Proj.firer) - return - else - ..() - -//////////////////////////////// -// Vox Ranged -//////////////////////////////// - -/mob/living/simple_mob/humanoid/merc/voxpirate/boarder - name = "vox ranged boarder" - desc = "A howling Vox with a shotgun. Get to cover!" - icon_state = "voxboarder_r" - icon_living = "voxboarder_r" - icon_dead = "voxboarder_r_dead" - catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/boarder) - - projectiletype = /obj/item/projectile/bullet/pellet/shotgun - projectilesound = 'sound/weapons/Gunshot_shotgun.ogg' - - ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive - corpse = /obj/effect/landmark/mobcorpse/vox/boarder_r - loot_list = list(/obj/item/gun/projectile/shotgun/pump/combat = 100, - /obj/item/ammo_magazine/m12gdrum = 30, - /obj/item/ammo_magazine/m12gdrum = 30 - ) - - needs_reload = TRUE - reload_max = 10 - -/datum/category_item/catalogue/fauna/mercenary/vox/technician - name = "Mercenaries - Vox Technician" - desc = "The belief that Vox are unintelligent comes largely from a kind \ - of anthrochauvanism. Due to their difficulty speaking GalCom and their tendency \ - to resort to underhanded methods, the Galaxy sees Vox as brutal, unintelligent \ - aliens. In reality, Vox are just as intelligent as everyone else, as the state \ - of their technology shows. Vox Technicians maintain ancient vessels and tools \ - with scraps and odd bits, often recieving no external recognition for their work." - value = CATALOGUER_REWARD_MEDIUM - -/mob/living/simple_mob/humanoid/merc/voxpirate/technician - name = "vox salvage technician" - desc = "A screeching Vox with an ion rifle. Usually sent on scrapping operations." - icon_state = "voxboarder_t" - icon_living = "voxboarder_t" - icon_dead = "voxboarder_t_dead" - catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/technician) - - projectiletype = /obj/item/projectile/ion - projectilesound = 'sound/weapons/Laser.ogg' - - ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting - corpse = /obj/effect/landmark/mobcorpse/vox/boarder_t - loot_list = list(/obj/item/gun/energy/ionrifle) - - needs_reload = TRUE - reload_max = 25 //Suppressive tech weapon. - -/datum/category_item/catalogue/fauna/mercenary/vox/suppressor - name = "Mercenaries - Vox Suppressor" - desc = "Among Vox bands, Suppressors are an even more motley crew. \ - Staying true to the name, Suppressors are veteran Vox pirates who have \ - faced hundreds of engagements. Tough and well suited for violence, these \ - Vox wear bright, mismatching colors into battle to draw attention. Serving \ - as a beacon to draw eyes away from their companions, Suppressors wield the \ - fearsome Sonic Cannon - a booming directed frequency device capable of \ - wreaking havoc all its own. It doesn't sound half bad either, when it isn't \ - pointed at you." - value = CATALOGUER_REWARD_MEDIUM - -/mob/living/simple_mob/humanoid/merc/voxpirate/ranged/suppressor - name = "vox suppressor" - desc = "Come on, feel the noise!" - icon_state = "voxsuppressor" - icon_living = "voxsuppressor" - icon_dead = "voxsuppresor_dead" - catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/suppressor) - - armor = list(melee = 30, bullet = 50, laser = 60, energy = 30, bomb = 35, bio = 100, rad = 100) // Boosted armor to represent Tank role. - - projectiletype = /obj/item/projectile/sonic/weak - projectilesound = 'sound/effects/basscannon.ogg' - - ai_holder_type = /datum/ai_holder/simple_mob/destructive - corpse = /obj/effect/landmark/mobcorpse/vox/suppressor - loot_list = list(/obj/item/gun/energy/sonic = 100) - - base_attack_cooldown = 5 // Two attacks a second or so. - needs_reload = TRUE - reload_max = 30 //Gotta lay down that fire, son. - -/datum/category_item/catalogue/fauna/mercenary/vox/captain - name = "Mercenaries - Vox Captain" - desc = "Accomplished Vox who bring in scrap reliably eventually become the \ - 'Quills' of their own expeditions. This Vox term is considered analagous to \ - the word 'Captain'. As such, any Vox who has attained this rank has certainly \ - earned the powerful equipment they carry into combat: Dark Matter cannons, \ - advanced armor, proper Hunting Rifles - the list goes on. The Vox Captain \ - is a formidable opponent, honed by years of hard living and harder fighting. \ - If you are unable to negotiate, expect to face their entire crew head on." - value = CATALOGUER_REWARD_MEDIUM - -/mob/living/simple_mob/humanoid/merc/voxpirate/ranged/captain - name = "vox pirate captain" - desc = "Walkings the plank, dustlung! Yayaya." - icon_state = "voxcaptain" - icon_living = "voxcaptain" - icon_dead = "voxcaptain_dead" - catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/captain) - - armor = list(melee = 60, bullet = 50, laser = 40, energy = 15, bomb = 30, bio = 100, rad = 100) // Vox RIG armor values. - - projectiletype = /obj/item/projectile/beam/darkmatter - projectilesound = 'sound/weapons/eLuger.ogg' - - ai_holder_type = /datum/ai_holder/simple_mob/destructive - corpse = /obj/effect/landmark/mobcorpse/vox/captain - loot_list = list(/obj/item/gun/energy/darkmatter = 100) - - needs_reload = TRUE - reload_max = 15 //Other Vox should be carrying ammo. diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/merd_catalogs.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/merd_catalogs.dm new file mode 100644 index 0000000000..b1bafd0e35 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/merd_catalogs.dm @@ -0,0 +1,80 @@ +/datum/category_item/catalogue/fauna/mercenary + name = "Mercenaries" + desc = "Life on the Frontier is hard, and unregulated. Unlike life in \ + more 'civlized' areas of the Galaxy, violence and piracy remain common \ + this far out. The Megacorporations keep a tight grip on their holdings, \ + but there are always small bands or aspiring companies looking to make a \ + thaler. From simple pirates to legitimate PMCs, Frontier mercs come in \ + all shapes and sizes." + value = CATALOGUER_REWARD_TRIVIAL + unlocked_by_any = list(/datum/category_item/catalogue/fauna/mercenary) + +// Obtained by scanning all X. +/datum/category_item/catalogue/fauna/all_mercenaries + name = "Collection - Mercenaries" + desc = "You have scanned a large array of different types of mercenary, \ + and therefore you have been granted a large sum of points, through this \ + entry." + value = CATALOGUER_REWARD_HARD + unlocked_by_all = list( + /datum/category_item/catalogue/fauna/mercenary/human, + /datum/category_item/catalogue/fauna/mercenary/human/peacekeeper, + /datum/category_item/catalogue/fauna/mercenary/human/grenadier, + /datum/category_item/catalogue/fauna/mercenary/human/space, + /datum/category_item/catalogue/fauna/mercenary/human/space/suppressor, + /datum/category_item/catalogue/fauna/mercenary/vox, + /datum/category_item/catalogue/fauna/mercenary/vox/boarder, + /datum/category_item/catalogue/fauna/mercenary/vox/technician, + /datum/category_item/catalogue/fauna/mercenary/vox/suppressor, + /datum/category_item/catalogue/fauna/mercenary/vox/captain + ) + +/datum/category_item/catalogue/fauna/mercenary/human + name = "Mercenaries - Human" + desc = "Human Mercenary bands are extremely common on the Frontier. Many \ + of the modern outfits operating on the fringe today are veterans of the \ + Phoron Wars. After the dissolution of the Syndicate, these operatives were \ + left without a place to call home. Those who have survived have leveraged \ + their experience into a viable trade." + value = CATALOGUER_REWARD_EASY + +/datum/category_item/catalogue/fauna/mercenary/human/peacekeeper + name = "Mercenaries - Solar Peacekeeper" + desc = "Activist groups in Civlized Space often raise moral concerns about \ + conditions on the Frontier. The more organized groups will sometimes gather \ + bands of mercenaries from the core worlds together under the belief that they \ + can come out to the Frontier to enforce their way of life. Due to the Frontier \ + Act, these 'humanitarian operations' are quickly demolished." + value = CATALOGUER_REWARD_EASY + +/datum/category_item/catalogue/fauna/mercenary/human/grenadier + name = "Mercenaries - Grenadier" + desc = "After the Phoron Wars, many deniable operatives on both sides of \ + the conflict found that there was no place for them within their home companies \ + any more. Left without options, these highly motivated and trained specialists \ + often seek revenge, or attempt to carve out their own fiefdoms. Well equipped \ + and well trained, these outcasts are not to be taken lightly." + value = CATALOGUER_REWARD_EASY + +/datum/category_item/catalogue/fauna/mercenary/human/space + name = "Mercenaries - Commando" + desc = "Commandos, much like their less equipped brethren, are experts in \ + wet work. Honing their skills over years of training, the Commando's iconic \ + equipment summons memories of the bad old days in any survivor who sees them. \ + These mercs make a statement with their equipment - 'I was there. Come get me.' \ + It is usually not an idle boast." + value = CATALOGUER_REWARD_EASY + +// suppressors are just assholes and are intended to be a piss poor experience for everyone on both sides +/datum/category_item/catalogue/fauna/mercenary/human/space/suppressor + name = "Mercenaries - Suppressor" + desc = "Just because the Phoron Wars are over, it doesn't mean that covert \ + actions and corporate espionage ended too. When you encounter mercs with \ + the latest gear and the best training, you can bet your bottom Thaler that \ + they've got a Corporate sponsor backing them up." + value = CATALOGUER_REWARD_MEDIUM + +/datum/ai_holder/simple_mob/merc/ranged/suppressor + respect_alpha = FALSE // he really just shoots you + vision_range = 10 // plutonia experience + conserve_ammo = FALSE diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/vox.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/vox.dm new file mode 100644 index 0000000000..afc0225388 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/vox.dm @@ -0,0 +1,236 @@ +//////////////////////////////// +// Vox Pirates +//////////////////////////////// +//Classifying these as Mercs, due to the general power level I want them at. + +/datum/category_item/catalogue/fauna/mercenary/vox + name = "Mercenaries - Vox" + desc = "For centuries the Vox have inflicted their way of life upon the \ + Galaxy. Regarded with distrust due to their tendency to engage in piracy \ + and violence, the Vox are equally feared for their robust physiology and \ + curiously advanced xenotech. Due to ancient compacts, Vox pirates try to \ + avoid bloodshed, but will react to violence in kind." + value = CATALOGUER_REWARD_MEDIUM + unlocked_by_any = list(/datum/category_item/catalogue/fauna/mercenary/vox) + +/mob/living/simple_mob/humanoid/merc/voxpirate //Don't use this one. + name = "vox mannequin" + desc = "You shouldn't be seeing this one." + icon_state = "voxpirate" + icon_living = "voxpirate" + icon_dead = "voxpirate_dead" + + faction = "voxpirate" + movement_cooldown = 4 + + status_flags = 0 + + response_help = "pokes" + response_disarm = "shoves" + response_harm = "hits" + + harm_intent_damage = 5 + melee_damage_lower = 20 //Vox Hunting rifle blade damage + melee_damage_upper = 20 + attack_sharp = 1 + attack_edge = 1 + attacktext = list("slashed", "stabbed") + armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 100) // Matching Merc voidsuit stats to represent toughness. + + min_oxy = 0 //Vox are spaceproof. + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + + corpse = /obj/effect/landmark/mobcorpse/vox/pirate + loot_list = list(/*/obj/item/gun/projectile/shotgun/pump/rifle/vox_hunting = 100, Downstream */ + /obj/item/ammo_magazine/clip/c762 = 30, + /obj/item/ammo_magazine/clip/c762 = 30 + ) + + ai_holder_type = /datum/ai_holder/simple_mob/merc + say_list_type = /datum/say_list/merc/voxpirate + +/mob/living/simple_mob/humanoid/merc/voxpirate/pirate + name = "vox pirate" + desc = "A desperate looking Vox. Get your gun." + + projectiletype = /obj/item/projectile/bullet/rifle/a762 + projectilesound = 'sound/weapons/riflebolt.ogg' + needs_reload = TRUE + reload_max = 20 + +//////////////////////////////// +// Vox Melee +//////////////////////////////// + +/datum/category_item/catalogue/fauna/mercenary/vox/boarder + name = "Mercenaries - Vox Boarder" + desc = "Vox are squat creatures, with powerful muscles and tough, scaly \ + hides. Their dense bones and sharp talons make them a formidable threat in \ + close quarters combat. Low level Vox weaponry generally emphasizes closing \ + the distance to exploit these facts." + value = CATALOGUER_REWARD_MEDIUM + +/mob/living/simple_mob/humanoid/merc/voxpirate/boarder + name = "vox melee boarder" + desc = "A howling Vox with a sword. Run." + icon_state = "voxboarder_m" + icon_living = "voxboarder_m" + icon_dead = "voxboarder_m_dead" + catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/boarder) + + melee_damage_lower = 30 //Energy sword damage + melee_damage_upper = 30 + attack_sharp = 1 + attack_edge = 1 + + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive + corpse = /obj/effect/landmark/mobcorpse/vox/boarder_m + loot_list = list(/obj/item/melee/energy/sword = 100) + +// They're good with the swords? I dunno. I like the idea they can deflect. +/mob/living/simple_mob/humanoid/merc/voxpirate/boarder/attackby(var/obj/item/O, var/mob/user) + if(O.force) + if(prob(20)) + visible_message(span_danger("\The [src] blocks \the [O] with its sword!")) + if(user) + ai_holder.react_to_attack(user) + return + else + ..() + else + to_chat(user, span_warning("This weapon is ineffective, it does no damage.")) + visible_message(span_warning("\The [user] gently taps [src] with \the [O].")) + +/mob/living/simple_mob/humanoid/merc/voxpirate/boarder/bullet_act(var/obj/item/projectile/Proj) + if(!Proj) return + if(prob(35)) + visible_message(span_warning("[src] blocks [Proj] with its sword!")) + if(Proj.firer) + ai_holder.react_to_attack(Proj.firer) + return + else + ..() + +//////////////////////////////// +// Vox Ranged +//////////////////////////////// + +/mob/living/simple_mob/humanoid/merc/voxpirate/boarder + name = "vox ranged boarder" + desc = "A howling Vox with a shotgun. Get to cover!" + icon_state = "voxboarder_r" + icon_living = "voxboarder_r" + icon_dead = "voxboarder_r_dead" + catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/boarder) + + projectiletype = /obj/item/projectile/bullet/pellet/shotgun + projectilesound = 'sound/weapons/Gunshot_shotgun.ogg' + + ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive + corpse = /obj/effect/landmark/mobcorpse/vox/boarder_r + loot_list = list(/obj/item/gun/projectile/shotgun/pump/combat = 100, + /obj/item/ammo_magazine/m12gdrum = 30, + /obj/item/ammo_magazine/m12gdrum = 30 + ) + + needs_reload = TRUE + reload_max = 10 + +/datum/category_item/catalogue/fauna/mercenary/vox/technician + name = "Mercenaries - Vox Technician" + desc = "The belief that Vox are unintelligent comes largely from a kind \ + of anthrochauvanism. Due to their difficulty speaking GalCom and their tendency \ + to resort to underhanded methods, the Galaxy sees Vox as brutal, unintelligent \ + aliens. In reality, Vox are just as intelligent as everyone else, as the state \ + of their technology shows. Vox Technicians maintain ancient vessels and tools \ + with scraps and odd bits, often recieving no external recognition for their work." + value = CATALOGUER_REWARD_MEDIUM + +/mob/living/simple_mob/humanoid/merc/voxpirate/technician + name = "vox salvage technician" + desc = "A screeching Vox with an ion rifle. Usually sent on scrapping operations." + icon_state = "voxboarder_t" + icon_living = "voxboarder_t" + icon_dead = "voxboarder_t_dead" + catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/technician) + + projectiletype = /obj/item/projectile/ion + projectilesound = 'sound/weapons/Laser.ogg' + + ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting + corpse = /obj/effect/landmark/mobcorpse/vox/boarder_t + loot_list = list(/obj/item/gun/energy/ionrifle) + + needs_reload = TRUE + reload_max = 25 //Suppressive tech weapon. + +/datum/category_item/catalogue/fauna/mercenary/vox/suppressor + name = "Mercenaries - Vox Suppressor" + desc = "Among Vox bands, Suppressors are an even more motley crew. \ + Staying true to the name, Suppressors are veteran Vox pirates who have \ + faced hundreds of engagements. Tough and well suited for violence, these \ + Vox wear bright, mismatching colors into battle to draw attention. Serving \ + as a beacon to draw eyes away from their companions, Suppressors wield the \ + fearsome Sonic Cannon - a booming directed frequency device capable of \ + wreaking havoc all its own. It doesn't sound half bad either, when it isn't \ + pointed at you." + value = CATALOGUER_REWARD_MEDIUM + +/mob/living/simple_mob/humanoid/merc/voxpirate/ranged/suppressor + name = "vox suppressor" + desc = "Come on, feel the noise!" + icon_state = "voxsuppressor" + icon_living = "voxsuppressor" + icon_dead = "voxsuppresor_dead" + catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/suppressor) + + armor = list(melee = 30, bullet = 50, laser = 60, energy = 30, bomb = 35, bio = 100, rad = 100) // Boosted armor to represent Tank role. + + projectiletype = /obj/item/projectile/sonic/weak + projectilesound = 'sound/effects/basscannon.ogg' + + ai_holder_type = /datum/ai_holder/simple_mob/destructive + corpse = /obj/effect/landmark/mobcorpse/vox/suppressor + loot_list = list(/obj/item/gun/energy/sonic = 100) + + base_attack_cooldown = 5 // Two attacks a second or so. + needs_reload = TRUE + reload_max = 30 //Gotta lay down that fire, son. + +/datum/category_item/catalogue/fauna/mercenary/vox/captain + name = "Mercenaries - Vox Captain" + desc = "Accomplished Vox who bring in scrap reliably eventually become the \ + 'Quills' of their own expeditions. This Vox term is considered analagous to \ + the word 'Captain'. As such, any Vox who has attained this rank has certainly \ + earned the powerful equipment they carry into combat: Dark Matter cannons, \ + advanced armor, proper Hunting Rifles - the list goes on. The Vox Captain \ + is a formidable opponent, honed by years of hard living and harder fighting. \ + If you are unable to negotiate, expect to face their entire crew head on." + value = CATALOGUER_REWARD_MEDIUM + +/mob/living/simple_mob/humanoid/merc/voxpirate/ranged/captain + name = "vox pirate captain" + desc = "Walkings the plank, dustlung! Yayaya." + icon_state = "voxcaptain" + icon_living = "voxcaptain" + icon_dead = "voxcaptain_dead" + catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/captain) + + armor = list(melee = 60, bullet = 50, laser = 40, energy = 15, bomb = 30, bio = 100, rad = 100) // Vox RIG armor values. + + projectiletype = /obj/item/projectile/beam/darkmatter + projectilesound = 'sound/weapons/eLuger.ogg' + + ai_holder_type = /datum/ai_holder/simple_mob/destructive + corpse = /obj/effect/landmark/mobcorpse/vox/captain + loot_list = list(/obj/item/gun/energy/darkmatter = 100) + + needs_reload = TRUE + reload_max = 15 //Other Vox should be carrying ammo. diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/pirates.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/pirates.dm index 18d6dba886..9e0d37bf47 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/pirates.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/pirates.dm @@ -1,11 +1,29 @@ -/* CHOMPEdit - Overridden basically everything in pirates_ch.dm +/////////////////////////////// +// Yargh Yargh Fiddle De Di +/////////////////////////////// + +/datum/category_item/catalogue/fauna/pirate + name = "Pirates" + desc = "Life on the Frontier is often harsh, and there are many \ + natural hazards which must be navigated and accounted for. In the \ + face of such constant adversity, some colonists will resort to crime \ + and piracy to try and make their way. From misguided attempts at \ + survival to malicious profiteering, Piracy is a constant concern \ + on the Frontier, and is punished harshly by every Megacorporation." + value = CATALOGUER_REWARD_TRIVIAL + +/////////////////////////////// +// Knife Priate +/////////////////////////////// /mob/living/simple_mob/humanoid/pirate name = "Pirate" desc = "Does what he wants cause a pirate is free." tt_desc = "E Homo sapiens" + icon = 'icons/mob/pirates.dmi' icon_state = "piratemelee" icon_living = "piratemelee" icon_dead = "piratemelee_dead" + catalogue_data = list(/datum/category_item/catalogue/fauna/pirate) faction = FACTION_PIRATE @@ -13,31 +31,475 @@ response_disarm = "shoves" response_harm = "hits" + movement_cooldown = 2 + harm_intent_damage = 5 - melee_damage_lower = 30 - melee_damage_upper = 30 - attack_armor_pen = 30 - attack_sharp = TRUE + melee_damage_lower = 15 //Tac Knife damage + melee_damage_upper = 15 + attack_sharp = 1 attack_edge = 1 - attacktext = list("slashed") + attacktext = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_sound = 'sound/weapons/bladeslice.ogg' - loot_list = list(/obj/item/melee/energy/sword/pirate = 100) + loot_list = list(/obj/item/material/knife/tacknife = 100) corpse = /obj/effect/landmark/mobcorpse/pirate + ai_holder_type = /datum/ai_holder/simple_mob/merc + say_list_type = /datum/say_list/pirate + +/mob/living/simple_mob/humanoid/pirate/Initialize(mapload) + . = ..() + loot_list += list(/obj/item/salvage/loot/pirate = 35) + +//Armored Variant + +/mob/living/simple_mob/humanoid/pirate/armored + name = "Armored Pirate" + desc = "Does what he wants cause a pirate is free. This one wears crude armor." + icon_state = "piratemelee-armor" + icon_living = "piratemelee-armor" + movement_cooldown = 4 + armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) + loot_list = list(/obj/item/material/knife/tacknife = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) + +/////////////////////////////// +// Machete Priate +/////////////////////////////// + +/mob/living/simple_mob/humanoid/pirate/machete + name = "Pirate Brush Cutter" + desc = "Does what he wants cause a pirate is free. This one has got a machete." + tt_desc = "E Homo sapiens" + icon_state = "piratemelee-machete" + icon_living = "piratemelee-machete" + icon_dead = "piratemelee_dead" + + response_help = "pushes" + response_disarm = "shoves" + response_harm = "hits" + + + melee_damage_lower = 25 //Macehte damage + melee_damage_upper = 25 + + attacktext = list("slashed", "chopped", "gouged", "ripped", "cut") + attack_sound = 'sound/weapons/bladeslice.ogg' + + loot_list = list(/obj/item/material/knife/machete = 100) + + corpse = /obj/effect/landmark/mobcorpse/pirate + +//Armored Variant + +/mob/living/simple_mob/humanoid/pirate/machete/armored + name = "Armored Brush Cutter" + desc = "Does what he wants cause a pirate is free. This one has got a machete and wears crude armor." + icon_state = "piratemelee-machete-armor" + icon_living = "piratemelee-machete-armor" + movement_cooldown = 3 + armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) + loot_list = list(/obj/item/material/knife/machete = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) + +/////////////////////////////// +// E-Sword Priate +/////////////////////////////// + +/mob/living/simple_mob/humanoid/pirate/las + name = "Pirate Duelist" + desc = "Does what he wants cause a pirate is free. This one has a energy sword." + tt_desc = "E Homo sapiens" + icon_state = "piratemelee-las" + icon_living = "piratemelee-las" + icon_dead = "piratemelee_dead" + + melee_damage_lower = 30 //E-Sword Damage + melee_damage_upper = 30 + attack_armor_pen = 50 + + attack_sound = 'sound/weapons/blade1.ogg' + + + loot_list = list(/obj/item/melee/energy/sword/pirate = 100) + +//Armored Variant +/mob/living/simple_mob/humanoid/pirate/las/armored + name = "Armored Duelist" + desc = "Does what he wants cause a pirate is free. This one has an energy sword." + icon_state = "piratemelee-las-armor" + icon_living = "piratemelee-las-armor" + movement_cooldown = 4 + armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) + loot_list = list(/obj/item/melee/energy/sword/pirate = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) + + +/////////////////////////////// +// Shield Pirate +/////////////////////////////// +/mob/living/simple_mob/humanoid/pirate/shield + name = "Pirate Buckler" + desc = "Does what he wants cause a pirate is free. This one carries a shield for added protection." + icon_state = "piratemelee-shield" + icon_living = "piratemelee-shield" + +//This Should Allow all childs of the shield priate to block +/mob/living/simple_mob/humanoid/pirate/shield/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(O.force) + if(prob(15)) + visible_message(span_danger("\The [src] blocks \the [O] with its shield!")) + if(user) + ai_holder.react_to_attack(user) + return + else + ..() + else + to_chat(user, span_warning("This weapon is ineffective, it does no damage.")) + visible_message(span_warning("\The [user] gently taps [src] with \the [O].")) + +/mob/living/simple_mob/humanoid/merc/melee/sword/bullet_act(var/obj/item/projectile/Proj) + if(!Proj) return + if(prob(25)) + visible_message(span_bolddanger("[src] blocks [Proj] with its shield!")) + if(Proj.firer) + ai_holder.react_to_attack(Proj.firer) + return + else + ..() + +// Armored Variant +/mob/living/simple_mob/humanoid/pirate/shield/armored + name = "Armored Buckler" + desc = "Does what he wants cause a pirate is free. This carries a shield and wears crude armor." + icon_state = "piratemelee-shield-armor" + icon_living = "piratemelee-shield-armor" + movement_cooldown = 3 + armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) + loot_list = list(/obj/item/material/knife/tacknife = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) + +/////////////////////////////// +// Shield Machete Pirate +/////////////////////////////// + +/mob/living/simple_mob/humanoid/pirate/shield/machete + name = "Pirate Sword and Boarder" + desc = "Does what he wants cause a pirate is free. This one has got a machete and a shield." + icon_state = "piratemelee-shield-machete" + icon_living = "piratemelee-shield-machete" + icon_dead = "piratemelee_dead" + + response_help = "pushes" + response_disarm = "shoves" + response_harm = "hits" + + + melee_damage_lower = 25 //Macehte damage + melee_damage_upper = 25 + + attacktext = list("slashed", "chopped", "gouged", "ripped", "cut") + attack_sound = 'sound/weapons/bladeslice.ogg' + + loot_list = list(/obj/item/material/knife/machete = 100) + +// Armored Variant +/mob/living/simple_mob/humanoid/pirate/shield/machete/armored + name = "Armored Sword and Boarder" + desc = "Does what he wants cause a pirate is free. This one is equipped old fashioned sword and shield along with crude armor." + icon_state = "piratemelee-shield-machete-armor" + icon_living = "piratemelee-shield-machete-armor" + movement_cooldown = 4 + armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) + loot_list = list(/obj/item/material/knife/machete = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) + + + + + +/////////////////////////////// +// Pirate Pistolier +/////////////////////////////// + /mob/living/simple_mob/humanoid/pirate/ranged - name = "Pirate Gunner" + name = "Pirate Pistolier" + desc = "Does what he wants since a pirate is free. This one is armed with a zip gun." icon_state = "pirateranged" icon_living = "pirateranged" icon_dead = "piratemelee_dead" - projectiletype = /obj/item/projectile/beam - projectilesound = 'sound/weapons/laser.ogg' + reload_time = 4 SECONDS // ZipGuns are finicky an hard to load + needs_reload = TRUE + reload_max = 1 - loot_list = list(/obj/item/gun/energy/laser = 100) + projectiletype = /obj/item/projectile/bullet/shotgun + projectilesound = 'sound/weapons/weaponsounds_shotgunshot.ogg' + + loot_list = list(/obj/item/gun/projectile/pirate = 100, /obj/item/material/knife/tacknife = 100) + + ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged + + +//Armored Variant +/mob/living/simple_mob/humanoid/pirate/ranged/armored + name = "Armored Pistolier" + desc = "Does what he wants cause a pirate is free. This is armed with a zip gun and wears crude armor." + icon_state = "pirateranged-armor" + icon_living = "pirateranged-armor" + movement_cooldown = 4 + armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) + loot_list = list(/obj/item/material/knife/tacknife = 100, /obj/item/gun/projectile/pirate = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) + +/////////////////////////////// +// Pirate Blunderbuster +/////////////////////////////// + +/mob/living/simple_mob/humanoid/pirate/ranged/shotgun + name = "Pirate Blunderbuster" + desc = "Does what he wants since a pirate is free. This one has a sawn off shotgun." + icon_state = "pirateranged-blunder" + icon_living = "pirateranged-blunder" + icon_dead = "piratemelee_dead" + + reload_time = 3 SECONDS // Shotgun Reload + needs_reload = TRUE + reload_max = 2 + + projectiletype = /obj/item/projectile/bullet/pellet/shotgun + projectilesound = 'sound/weapons/weaponsounds_shotgunshot.ogg' + + loot_list = list(/obj/item/gun/projectile/shotgun/doublebarrel/sawn = 100, /obj/item/material/knife/tacknife = 100) + + ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive + +//Armored Variant +/mob/living/simple_mob/humanoid/pirate/ranged/shotgun/armored + name = "Armored Blunderbuster" + desc = "Does what he wants cause a pirate is free. This is armed with a sawn off shotgun and wears crude armor." + icon_state = "pirateranged-blunder-armor" + icon_living = "pirateranged-blunder-armor" + movement_cooldown = 4 + armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) + loot_list = list(/obj/item/material/knife/tacknife = 100, /obj/item/gun/projectile/shotgun/doublebarrel/sawn = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) + +/////////////////////////////// +// Pirate Ziplas +/////////////////////////////// + +/mob/living/simple_mob/humanoid/pirate/ranged/handcannon + name = "Pirate Handcannon" + desc = "Does what he wants since a pirate is free. This one has an improvised laser pistol." + icon_state = "pirateranged-handcannon" + icon_living = "pirateranged-handcannon" + icon_dead = "piratemelee_dead" + + reload_time = 6 SECONDS //Zip-Las takes a real long time to reload. + needs_reload = TRUE + reload_max = 1 + + projectiletype = /obj/item/projectile/beam/heavylaser + projectilesound = 'sound/weapons/weaponsounds_laserstrong.ogg' + + loot_list = list(/obj/item/gun/energy/zip = 100, /obj/item/material/knife/tacknife = 100) + + ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive + +//Armored Variant +/mob/living/simple_mob/humanoid/pirate/ranged/handcannon/armored + name = "Armored Handcannon" + desc = "Does what he wants cause a pirate is free. This one has a improvised laser pistol and crude armor." + icon_state = "pirateranged-handcannon-armor" + icon_living = "pirateranged-handcannon-armor" + movement_cooldown = 4 + armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) + loot_list = list(/obj/item/material/knife/tacknife = 100, /obj/item/gun/energy/zip = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) + +/////////////////////////////// +// First Mate +/////////////////////////////// +/mob/living/simple_mob/humanoid/pirate/mate + name = "First Mate" + desc = "A leading figure amongst the pirate hoards. This one is armed with a laser cutlass" + tt_desc = "E Homo sapiens" + icon_state = "mate" + icon_living = "mate" + icon_dead = "piratemelee_dead" + + melee_damage_lower = 30 //E-Sword Damage + melee_damage_upper = 30 + attack_armor_pen = 50 + + attack_sound = 'sound/weapons/blade1.ogg' + + armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) + + loot_list = list(/obj/item/melee/energy/sword/pirate = 100, /obj/item/clothing/suit/pirate = 100) + + +/////////////////////////////// +// Mate Pistolier +/////////////////////////////// +/mob/living/simple_mob/humanoid/pirate/mate/ranged + name = "Mate Pistolier" + desc = "A leading figure amongst the pirate hoards. This one is armed with a obsolete laser pistol." + icon_state = "mate-pistoler" + icon_living = "mate-pistoler" + icon_dead = "piratemelee_dead" + + reload_time = 2 SECONDS //Retro Energy Pistol is far easier to reload than Zip-Las + needs_reload = TRUE + reload_max = 5 + + harm_intent_damage = 5 + melee_damage_lower = 15 + melee_damage_upper = 15 + + projectiletype = /obj/item/projectile/beam/midlaser + projectilesound = 'sound/weapons/weaponsounds_lasermid.ogg' + + attack_sound = 'sound/weapons/bladeslice.ogg' + base_attack_cooldown = 10 + + loot_list = list(/obj/item/gun/energy/retro = 100, /obj/item/clothing/suit/pirate = 100) + + ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged + +/mob/living/simple_mob/humanoid/pirate/mate/ranged/bosun /// Special Mech Pilot Pirate + name = "Bosun" + desc = "An oily pirate mechanist. Thankfully he has but an old laser to defend himself with." + icon_state = "bosun" + icon_living = "bosun" + movement_cooldown = 3 + ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive/blood_hunter // This is for use in the Pirate Ripley Mecha + + loot_list = list(/obj/item/gun/energy/retro = 100, /obj/item/clothing/head/welding = 100, /obj/item/clothing/suit/pirate = 100) + +/////////////////////////////// +// Mate Sweeper +/////////////////////////////// + +/mob/living/simple_mob/humanoid/pirate/mate/ranged/shotgun + name = "Mate Blunderbuster" + desc = "A leading figure amongst the pirate hoards. This one is armed with a four barreled shotgun" + icon_state = "mate-shotgun" + icon_living = "mate-shotgun" + icon_dead = "piratemelee_dead" + + reload_time = 4 SECONDS //Assume use of speedloaders + needs_reload = TRUE + reload_max = 4 + + harm_intent_damage = 5 + melee_damage_lower = 15 + melee_damage_upper = 15 + attack_sound = 'sound/weapons/bladeslice.ogg' + + projectiletype = /obj/item/projectile/bullet/pellet/shotgun + projectilesound = 'sound/weapons/weaponsounds_shotgunshot.ogg' + base_attack_cooldown = 5 + + loot_list = list(/*/obj/item/gun/projectile/shotgun/doublebarrel/quad = 100, Downstream*/ /obj/item/clothing/suit/pirate = 100) + +/////////////////////////////// +// Mate Marksman +/////////////////////////////// + +/mob/living/simple_mob/humanoid/pirate/mate/ranged/rifle + name = "Mate Marksman" + desc = "A leading figure amongst the pirate hoards. This one is armed with a rifle." + icon_state = "mate-rifle" + icon_living = "mate-rifle" + icon_dead = "piratemelee_dead" + + reload_time = 1.5 SECONDS //Assume use of speedloaders + needs_reload = TRUE + reload_max = 5 + + harm_intent_damage = 5 + melee_damage_lower = 15 + melee_damage_upper = 15 + attack_sound = 'sound/weapons/bladeslice.ogg' + + projectiletype = /obj/item/projectile/bullet/rifle/a762 + projectilesound = 'sound/weapons/weaponsounds_heavyrifleshot.ogg' + base_attack_cooldown = 10 + + loot_list = list(/obj/item/gun/projectile/shotgun/pump/rifle = 100, /obj/item/clothing/suit/pirate = 100) + +/////////////////////////////// +// Pirate Captain +/////////////////////////////// +/mob/living/simple_mob/humanoid/pirate/captain + name = "Pirate Captain" + desc = "Leader of a Pirate Vessel armed with an entire belt of improvised laser pistols. A true villian indeed." + icon_state = "captain" + icon_living = "captain" + icon_dead = "pirateranged_dead" + + reload_time = 10 SECONDS // I mean its a belt of pistols not exactly easy to reload. Especially with how much damage the barage does. + needs_reload = TRUE + reload_max = 4 + projectiletype = /obj/item/projectile/beam/heavylaser + projectilesound = 'sound/weapons/weaponsounds_laserstrong.ogg' + base_attack_cooldown = 5 corpse = /obj/effect/landmark/mobcorpse/pirate/ranged -*/ + loot_list = list(/obj/item/gun/energy/zip = 100, /obj/item/gun/energy/zip = 100, /obj/item/gun/energy/zip = 100, /obj/item/gun/energy/zip = 100) //Belt of pistols + + var/obj/item/shield_projector/shields = null + +/mob/living/simple_mob/humanoid/pirate/captain/Initialize(mapload) + shields = new /obj/item/shield_projector/rectangle/automatic/drone(src) + return ..() + +/mob/living/simple_mob/humanoid/pirate/captain/Process_Spacemove(var/check_drift = 0) + return TRUE + +/obj/item/shield_projector/rectangle/automatic/drone + shield_health = 150 + max_shield_health = 150 + shield_regen_delay = 10 SECONDS + shield_regen_amount = 10 + size_x = 1 + size_y = 1 + + + +/mob/living/simple_mob/mechanical/mecha/ripley/pirate + name = "Hull Ripper" + desc = "A Ripley modified by pirates. Sports additional riveted armor plating and a jury rigged machine gun in addition to its hull piercing drill." + catalogue_data = list(/datum/category_item/catalogue/technology/ripley) + icon = 'icons/mob/pirates.dmi' + icon_state = "pirate" + faction = "pirate" + wreckage = /obj/structure/loot_pile/mecha/ripley/pirate + + maxHealth = 250 + heat_resist = 1 + armor = list( + "melee" = 30, + "bullet" = 40, + "laser" = 50, + "energy" = 5, + "bomb" = 50, + "bio" = 100, + "rad" = 100 + ) + + projectiletype = /obj/item/projectile/bullet/pistol + base_attack_cooldown = 0.5 SECONDS + needs_reload = TRUE + reload_max = 30 + reload_time = 3 + +/mob/living/simple_mob/mechanical/mecha/ripley/pirate/manned + pilot_type = /mob/living/simple_mob/humanoid/pirate/mate/ranged/bosun + +/mob/living/simple_mob/mechanical/mecha/ripley/pirate/last_stand_merc //Special version used as a quasi boss fight + name = "Xeno Ripper" + desc = "A Ripley modified by a desperate merc. It sports additional riveted armor plating splattered with dried xeno blood and a jury rigged machine gun in addition to its drill.\ + A repair drone flits around the intimidating mech." + ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive + maxHealth = 170 //Less Health + has_repair_droid = TRUE //But has repair drone + pilot_type = /mob/living/simple_mob/humanoid/possessed/merc/feral //Possessed rig suit piloting a mech. Tremble in fear + movement_shake_radius = 5 diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/pirates_ch.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/pirates_ch.dm deleted file mode 100644 index 692f43dd41..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/pirates_ch.dm +++ /dev/null @@ -1,505 +0,0 @@ -/////////////////////////////// -// Yargh Yargh Fiddle De Di -/////////////////////////////// - -/datum/category_item/catalogue/fauna/pirate - name = "Pirates" - desc = "Life on the Frontier is often harsh, and there are many \ - natural hazards which must be navigated and accounted for. In the \ - face of such constant adversity, some colonists will resort to crime \ - and piracy to try and make their way. From misguided attempts at \ - survival to malicious profiteering, Piracy is a constant concern \ - on the Frontier, and is punished harshly by every Megacorporation." - value = CATALOGUER_REWARD_TRIVIAL - -/////////////////////////////// -// Knife Priate -/////////////////////////////// -/mob/living/simple_mob/humanoid/pirate - name = "Pirate" - desc = "Does what he wants cause a pirate is free." - tt_desc = "E Homo sapiens" - icon = 'modular_chomp/icons/mob/animal_ch.dmi' - icon_state = "piratemelee" - icon_living = "piratemelee" - icon_dead = "piratemelee_dead" - catalogue_data = list(/datum/category_item/catalogue/fauna/pirate) - - faction = "pirate" - - response_help = "pushes" - response_disarm = "shoves" - response_harm = "hits" - - movement_cooldown = 2 - - harm_intent_damage = 5 - melee_damage_lower = 15 //Tac Knife damage - melee_damage_upper = 15 - attack_sharp = 1 - attack_edge = 1 - - attacktext = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - attack_sound = 'sound/weapons/bladeslice.ogg' - - loot_list = list(/obj/item/material/knife/tacknife = 100) - - corpse = /obj/effect/landmark/mobcorpse/pirate - - ai_holder_type = /datum/ai_holder/simple_mob/merc - say_list_type = /datum/say_list/pirate - -/mob/living/simple_mob/humanoid/pirate/Initialize(mapload) - . = ..() - loot_list += list(/obj/item/salvage/loot/pirate = 35) - -//Armored Variant - -/mob/living/simple_mob/humanoid/pirate/armored - name = "Armored Pirate" - desc = "Does what he wants cause a pirate is free. This one wears crude armor." - icon_state = "piratemelee-armor" - icon_living = "piratemelee-armor" - movement_cooldown = 4 - armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) - loot_list = list(/obj/item/material/knife/tacknife = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) - -/////////////////////////////// -// Machete Priate -/////////////////////////////// - -/mob/living/simple_mob/humanoid/pirate/machete - name = "Pirate Brush Cutter" - desc = "Does what he wants cause a pirate is free. This one has got a machete." - tt_desc = "E Homo sapiens" - icon_state = "piratemelee-machete" - icon_living = "piratemelee-machete" - icon_dead = "piratemelee_dead" - - response_help = "pushes" - response_disarm = "shoves" - response_harm = "hits" - - - melee_damage_lower = 25 //Macehte damage - melee_damage_upper = 25 - - attacktext = list("slashed", "chopped", "gouged", "ripped", "cut") - attack_sound = 'sound/weapons/bladeslice.ogg' - - loot_list = list(/obj/item/material/knife/machete = 100) - - corpse = /obj/effect/landmark/mobcorpse/pirate - -//Armored Variant - -/mob/living/simple_mob/humanoid/pirate/machete/armored - name = "Armored Brush Cutter" - desc = "Does what he wants cause a pirate is free. This one has got a machete and wears crude armor." - icon_state = "piratemelee-machete-armor" - icon_living = "piratemelee-machete-armor" - movement_cooldown = 3 - armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) - loot_list = list(/obj/item/material/knife/machete = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) - -/////////////////////////////// -// E-Sword Priate -/////////////////////////////// - -/mob/living/simple_mob/humanoid/pirate/las - name = "Pirate Duelist" - desc = "Does what he wants cause a pirate is free. This one has a energy sword." - tt_desc = "E Homo sapiens" - icon_state = "piratemelee-las" - icon_living = "piratemelee-las" - icon_dead = "piratemelee_dead" - - melee_damage_lower = 30 //E-Sword Damage - melee_damage_upper = 30 - attack_armor_pen = 50 - - attack_sound = 'sound/weapons/blade1.ogg' - - - loot_list = list(/obj/item/melee/energy/sword/pirate = 100) - -//Armored Variant -/mob/living/simple_mob/humanoid/pirate/las/armored - name = "Armored Duelist" - desc = "Does what he wants cause a pirate is free. This one has an energy sword." - icon_state = "piratemelee-las-armor" - icon_living = "piratemelee-las-armor" - movement_cooldown = 4 - armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) - loot_list = list(/obj/item/melee/energy/sword/pirate = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) - - -/////////////////////////////// -// Shield Pirate -/////////////////////////////// -/mob/living/simple_mob/humanoid/pirate/shield - name = "Pirate Buckler" - desc = "Does what he wants cause a pirate is free. This one carries a shield for added protection." - icon_state = "piratemelee-shield" - icon_living = "piratemelee-shield" - -//This Should Allow all childs of the shield priate to block -/mob/living/simple_mob/humanoid/pirate/shield/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(O.force) - if(prob(15)) - visible_message(span_danger("\The [src] blocks \the [O] with its shield!")) - if(user) - ai_holder.react_to_attack(user) - return - else - ..() - else - to_chat(user, span_warning("This weapon is ineffective, it does no damage.")) - visible_message(span_warning("\The [user] gently taps [src] with \the [O].")) - -/mob/living/simple_mob/humanoid/merc/melee/sword/bullet_act(var/obj/item/projectile/Proj) - if(!Proj) return - if(prob(25)) - visible_message(span_bolddanger("[src] blocks [Proj] with its shield!")) - if(Proj.firer) - ai_holder.react_to_attack(Proj.firer) - return - else - ..() - -// Armored Variant -/mob/living/simple_mob/humanoid/pirate/shield/armored - name = "Armored Buckler" - desc = "Does what he wants cause a pirate is free. This carries a shield and wears crude armor." - icon_state = "piratemelee-shield-armor" - icon_living = "piratemelee-shield-armor" - movement_cooldown = 3 - armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) - loot_list = list(/obj/item/material/knife/tacknife = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) - -/////////////////////////////// -// Shield Machete Pirate -/////////////////////////////// - -/mob/living/simple_mob/humanoid/pirate/shield/machete - name = "Pirate Sword and Boarder" - desc = "Does what he wants cause a pirate is free. This one has got a machete and a shield." - icon_state = "piratemelee-shield-machete" - icon_living = "piratemelee-shield-machete" - icon_dead = "piratemelee_dead" - - response_help = "pushes" - response_disarm = "shoves" - response_harm = "hits" - - - melee_damage_lower = 25 //Macehte damage - melee_damage_upper = 25 - - attacktext = list("slashed", "chopped", "gouged", "ripped", "cut") - attack_sound = 'sound/weapons/bladeslice.ogg' - - loot_list = list(/obj/item/material/knife/machete = 100) - -// Armored Variant -/mob/living/simple_mob/humanoid/pirate/shield/machete/armored - name = "Armored Sword and Boarder" - desc = "Does what he wants cause a pirate is free. This one is equipped old fashioned sword and shield along with crude armor." - icon_state = "piratemelee-shield-machete-armor" - icon_living = "piratemelee-shield-machete-armor" - movement_cooldown = 4 - armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) - loot_list = list(/obj/item/material/knife/machete = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) - - - - - -/////////////////////////////// -// Pirate Pistolier -/////////////////////////////// - -/mob/living/simple_mob/humanoid/pirate/ranged - name = "Pirate Pistolier" - desc = "Does what he wants since a pirate is free. This one is armed with a zip gun." - icon_state = "pirateranged" - icon_living = "pirateranged" - icon_dead = "piratemelee_dead" - - reload_time = 4 SECONDS // ZipGuns are finicky an hard to load - needs_reload = TRUE - reload_max = 1 - - projectiletype = /obj/item/projectile/bullet/shotgun - projectilesound = 'sound/weapons/weaponsounds_shotgunshot.ogg' - - loot_list = list(/obj/item/gun/projectile/pirate = 100, /obj/item/material/knife/tacknife = 100) - - ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged - - -//Armored Variant -/mob/living/simple_mob/humanoid/pirate/ranged/armored - name = "Armored Pistolier" - desc = "Does what he wants cause a pirate is free. This is armed with a zip gun and wears crude armor." - icon_state = "pirateranged-armor" - icon_living = "pirateranged-armor" - movement_cooldown = 4 - armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) - loot_list = list(/obj/item/material/knife/tacknife = 100, /obj/item/gun/projectile/pirate = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) - -/////////////////////////////// -// Pirate Blunderbuster -/////////////////////////////// - -/mob/living/simple_mob/humanoid/pirate/ranged/shotgun - name = "Pirate Blunderbuster" - desc = "Does what he wants since a pirate is free. This one has a sawn off shotgun." - icon_state = "pirateranged-blunder" - icon_living = "pirateranged-blunder" - icon_dead = "piratemelee_dead" - - reload_time = 3 SECONDS // Shotgun Reload - needs_reload = TRUE - reload_max = 2 - - projectiletype = /obj/item/projectile/bullet/pellet/shotgun - projectilesound = 'sound/weapons/weaponsounds_shotgunshot.ogg' - - loot_list = list(/obj/item/gun/projectile/shotgun/doublebarrel/sawn = 100, /obj/item/material/knife/tacknife = 100) - - ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive - -//Armored Variant -/mob/living/simple_mob/humanoid/pirate/ranged/shotgun/armored - name = "Armored Blunderbuster" - desc = "Does what he wants cause a pirate is free. This is armed with a sawn off shotgun and wears crude armor." - icon_state = "pirateranged-blunder-armor" - icon_living = "pirateranged-blunder-armor" - movement_cooldown = 4 - armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) - loot_list = list(/obj/item/material/knife/tacknife = 100, /obj/item/gun/projectile/shotgun/doublebarrel/sawn = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) - -/////////////////////////////// -// Pirate Ziplas -/////////////////////////////// - -/mob/living/simple_mob/humanoid/pirate/ranged/handcannon - name = "Pirate Handcannon" - desc = "Does what he wants since a pirate is free. This one has an improvised laser pistol." - icon_state = "pirateranged-handcannon" - icon_living = "pirateranged-handcannon" - icon_dead = "piratemelee_dead" - - reload_time = 6 SECONDS //Zip-Las takes a real long time to reload. - needs_reload = TRUE - reload_max = 1 - - projectiletype = /obj/item/projectile/beam/heavylaser - projectilesound = 'sound/weapons/weaponsounds_laserstrong.ogg' - - loot_list = list(/obj/item/gun/energy/zip = 100, /obj/item/material/knife/tacknife = 100) - - ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive - -//Armored Variant -/mob/living/simple_mob/humanoid/pirate/ranged/handcannon/armored - name = "Armored Handcannon" - desc = "Does what he wants cause a pirate is free. This one has a improvised laser pistol and crude armor." - icon_state = "pirateranged-handcannon-armor" - icon_living = "pirateranged-handcannon-armor" - movement_cooldown = 4 - armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) - loot_list = list(/obj/item/material/knife/tacknife = 100, /obj/item/gun/energy/zip = 100, /obj/item/clothing/suit/armor/material/makeshift = 100) - -/////////////////////////////// -// First Mate -/////////////////////////////// -/mob/living/simple_mob/humanoid/pirate/mate - name = "First Mate" - desc = "A leading figure amongst the pirate hoards. This one is armed with a laser cutlass" - tt_desc = "E Homo sapiens" - icon_state = "mate" - icon_living = "mate" - icon_dead = "piratemelee_dead" - - melee_damage_lower = 30 //E-Sword Damage - melee_damage_upper = 30 - attack_armor_pen = 50 - - attack_sound = 'sound/weapons/blade1.ogg' - - armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100) - - loot_list = list(/obj/item/melee/energy/sword/pirate = 100, /obj/item/clothing/suit/pirate = 100) - - -/////////////////////////////// -// Mate Pistolier -/////////////////////////////// -/mob/living/simple_mob/humanoid/pirate/mate/ranged - name = "Mate Pistolier" - desc = "A leading figure amongst the pirate hoards. This one is armed with a obsolete laser pistol." - icon_state = "mate-pistoler" - icon_living = "mate-pistoler" - icon_dead = "piratemelee_dead" - - reload_time = 2 SECONDS //Retro Energy Pistol is far easier to reload than Zip-Las - needs_reload = TRUE - reload_max = 5 - - harm_intent_damage = 5 - melee_damage_lower = 15 - melee_damage_upper = 15 - - projectiletype = /obj/item/projectile/beam/midlaser - projectilesound = 'sound/weapons/weaponsounds_lasermid.ogg' - - attack_sound = 'sound/weapons/bladeslice.ogg' - base_attack_cooldown = 10 - - loot_list = list(/obj/item/gun/energy/retro = 100, /obj/item/clothing/suit/pirate = 100) - - ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged - -/mob/living/simple_mob/humanoid/pirate/mate/ranged/bosun /// Special Mech Pilot Pirate - name = "Bosun" - desc = "An oily pirate mechanist. Thankfully he has but an old laser to defend himself with." - icon_state = "bosun" - icon_living = "bosun" - movement_cooldown = 3 - ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive/blood_hunter // This is for use in the Pirate Ripley Mecha - - loot_list = list(/obj/item/gun/energy/retro = 100, /obj/item/clothing/head/welding = 100, /obj/item/clothing/suit/pirate = 100) - -/////////////////////////////// -// Mate Sweeper -/////////////////////////////// - -/mob/living/simple_mob/humanoid/pirate/mate/ranged/shotgun - name = "Mate Blunderbuster" - desc = "A leading figure amongst the pirate hoards. This one is armed with a four barreled shotgun" - icon_state = "mate-shotgun" - icon_living = "mate-shotgun" - icon_dead = "piratemelee_dead" - - reload_time = 4 SECONDS //Assume use of speedloaders - needs_reload = TRUE - reload_max = 4 - - harm_intent_damage = 5 - melee_damage_lower = 15 - melee_damage_upper = 15 - attack_sound = 'sound/weapons/bladeslice.ogg' - - projectiletype = /obj/item/projectile/bullet/pellet/shotgun - projectilesound = 'sound/weapons/weaponsounds_shotgunshot.ogg' - base_attack_cooldown = 5 - - loot_list = list(/obj/item/gun/projectile/shotgun/doublebarrel/quad = 100, /obj/item/clothing/suit/pirate = 100) - -/////////////////////////////// -// Mate Marksman -/////////////////////////////// - -/mob/living/simple_mob/humanoid/pirate/mate/ranged/rifle - name = "Mate Marksman" - desc = "A leading figure amongst the pirate hoards. This one is armed with a rifle." - icon_state = "mate-rifle" - icon_living = "mate-rifle" - icon_dead = "piratemelee_dead" - - reload_time = 1.5 SECONDS //Assume use of speedloaders - needs_reload = TRUE - reload_max = 5 - - harm_intent_damage = 5 - melee_damage_lower = 15 - melee_damage_upper = 15 - attack_sound = 'sound/weapons/bladeslice.ogg' - - projectiletype = /obj/item/projectile/bullet/rifle/a762 - projectilesound = 'sound/weapons/weaponsounds_heavyrifleshot.ogg' - base_attack_cooldown = 10 - - loot_list = list(/obj/item/gun/projectile/shotgun/pump/rifle = 100, /obj/item/clothing/suit/pirate = 100) - -/////////////////////////////// -// Pirate Captain -/////////////////////////////// -/mob/living/simple_mob/humanoid/pirate/captain - name = "Pirate Captain" - desc = "Leader of a Pirate Vessel armed with an entire belt of improvised laser pistols. A true villian indeed." - icon_state = "captain" - icon_living = "captain" - icon_dead = "pirateranged_dead" - - reload_time = 10 SECONDS // I mean its a belt of pistols not exactly easy to reload. Especially with how much damage the barage does. - needs_reload = TRUE - reload_max = 4 - projectiletype = /obj/item/projectile/beam/heavylaser - projectilesound = 'sound/weapons/weaponsounds_laserstrong.ogg' - base_attack_cooldown = 5 - - corpse = /obj/effect/landmark/mobcorpse/pirate/ranged - - loot_list = list(/obj/item/gun/energy/zip = 100, /obj/item/gun/energy/zip = 100, /obj/item/gun/energy/zip = 100, /obj/item/gun/energy/zip = 100) //Belt of pistols - - var/obj/item/shield_projector/shields = null - -/mob/living/simple_mob/humanoid/pirate/captain/Initialize(mapload) - shields = new /obj/item/shield_projector/rectangle/automatic/drone(src) - return ..() - -/mob/living/simple_mob/humanoid/pirate/captain/Process_Spacemove(var/check_drift = 0) - return TRUE - -/obj/item/shield_projector/rectangle/automatic/drone - shield_health = 150 - max_shield_health = 150 - shield_regen_delay = 10 SECONDS - shield_regen_amount = 10 - size_x = 1 - size_y = 1 - - - -/mob/living/simple_mob/mechanical/mecha/ripley/pirate - name = "Hull Ripper" - desc = "A Ripley modified by pirates. Sports additional riveted armor plating and a jury rigged machine gun in addition to its hull piercing drill." - catalogue_data = list(/datum/category_item/catalogue/technology/ripley) - icon = 'modular_chomp/icons/mob/animal_ch.dmi' - icon_state = "pirate" - faction = "pirate" - wreckage = /obj/structure/loot_pile/mecha/ripley/pirate - - maxHealth = 250 - heat_resist = 1 - armor = list( - "melee" = 30, - "bullet" = 40, - "laser" = 50, - "energy" = 5, - "bomb" = 50, - "bio" = 100, - "rad" = 100 - ) - - projectiletype = /obj/item/projectile/bullet/pistol - base_attack_cooldown = 0.5 SECONDS - needs_reload = TRUE - reload_max = 30 - reload_time = 3 - -/mob/living/simple_mob/mechanical/mecha/ripley/pirate/manned - pilot_type = /mob/living/simple_mob/humanoid/pirate/mate/ranged/bosun - -/mob/living/simple_mob/mechanical/mecha/ripley/pirate/last_stand_merc //Special version used as a quasi boss fight - name = "Xeno Ripper" - desc = "A Ripley modified by a desperate merc. It sports additional riveted armor plating splattered with dried xeno blood and a jury rigged machine gun in addition to its drill.\ - A repair drone flits around the intimidating mech." - ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive - maxHealth = 170 //Less Health - has_repair_droid = TRUE //But has repair drone - pilot_type = /mob/living/simple_mob/humanoid/possessed/merc/feral //Possessed rig suit piloting a mech. Tremble in fear - movement_shake_radius = 5 diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/possessed_ch.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/possessed.dm similarity index 99% rename from code/modules/mob/living/simple_mob/subtypes/humanoid/possessed_ch.dm rename to code/modules/mob/living/simple_mob/subtypes/humanoid/possessed.dm index 1089709518..a4da833476 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/possessed_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/possessed.dm @@ -5,7 +5,7 @@ /mob/living/simple_mob/humanoid/possessed name = "old EVA RIG suit" desc = "A light hardsuit for repairs and maintenance to the outside of habitats and vessels. Seems to be worn down and damaged. But it seems to still be moving. Is someone in it?" - icon = 'modular_chomp/icons/mob/animal_ch.dmi' + icon = 'icons/mob/possessed.dmi' icon_state = "eva-rig" faction = "Possessed" diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/russian.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/russian.dm index d8e1f5f95d..8f8c08558b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/russian.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/russian.dm @@ -19,17 +19,11 @@ melee_damage_upper = 15 attacktext = list("punched") - loot_list = list(/obj/item/material/knife = 100) + loot_list = list(/obj/item/material/knife = 100, + /obj/item/salvage/loot/russian = 10) corpse = /obj/effect/landmark/mobcorpse/russian -// CHOMPEdit Start -/mob/living/simple_mob/humanoid/russian - - loot_list = list(/obj/item/salvage/loot/russian = 10) - -// CHOMPEdit End - /mob/living/simple_mob/humanoid/russian/ranged icon_state = "russianranged" icon_living = "russianranged" diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/cyber_horror_ch.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/cyber_horror.dm similarity index 99% rename from code/modules/mob/living/simple_mob/subtypes/mechanical/cyber_horror_ch.dm rename to code/modules/mob/living/simple_mob/subtypes/mechanical/cyber_horror.dm index c3ca439fe8..83b4a404c3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/cyber_horror_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/cyber_horror.dm @@ -2,7 +2,7 @@ /mob/living/simple_mob/mechanical/cyber_horror name = "Cyber horror" desc = "What was once a man, twisted and warped by machine." - icon = 'modular_chomp/icons/mob/animal_ch.dmi' + icon = 'icons/mob/cyber_horror.dmi' icon_state = "cyber_horror" icon_dead = "cyber_horror_dead" icon_gib = "cyber_horror_dead" diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm index 1ab1002aec..2cd10fabfd 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm @@ -30,7 +30,7 @@ s.start() qdel(src) -// The hivebot's default projectile. //CHOMP Edit this is no longer actually used by ranged_damage.dm for the hivebot. Hivebot now uses custom 22 long rifle. +// The hivebot's default projectile. /obj/item/projectile/bullet/hivebot damage = 10 damage_type = BRUTE diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/support.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/support.dm index 8bab2b41be..fb1a0715d7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/support.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/support.dm @@ -40,7 +40,7 @@ disable_duration_percent = 0.7 outgoing_melee_damage_percent = 1.3 - attack_speed_percent = 0.7 // CHOMPedit: It was actually slowing it down, lol + attack_speed_percent = 0.7 accuracy = 30 slowdown = -1 evasion = 30 diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/combat_mecha.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/combat_mecha.dm index 7c2c66eb60..cabc826174 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/combat_mecha.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/combat_mecha.dm @@ -36,5 +36,5 @@ L.throw_at(get_edge_target_turf(L, throw_dir), throw_dist, 1, src) else to_chat(L, span_warning("\The [src] punches you with incredible force, but you remain in place.")) - visible_message(span_danger("\The [src] slams it's mechanized fist into \the [L] with incredible force, to no visible effect!")) // CHOMPEdit: Mechpunch visible/audible feedback for *resisting* the punch. - playsound(src, "punch", 50, 1) // CHOMPEdit: Mechpunch visible/audible feedback for *resisting* the punch. + visible_message(span_danger("\The [src] slams it's mechanized fist into \the [L] with incredible force, to no visible effect!")) + playsound(src, "punch", 50, 1) diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm index 1cc72cfd87..47ec20506f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm @@ -12,12 +12,12 @@ to counter the Unathi war machine. One of many solutions created was the Durand, which was made to be heavy and \ well-armored, and be capable of powering the various weapons that could be mounted onto it. Presently, the \ Durand now generally serves as corporate asset protection hardware, due to modern militaries moving on to newer, \ - more advanced war machines." + more advanced war machines." // CHOMPEdit value = CATALOGUER_REWARD_HARD /mob/living/simple_mob/mechanical/mecha/combat/durand name = "durand" - desc = "An aging combat exosuit utilized by many corporations. It was originally developed to fight in the First Contact War." + desc = "An aging combat exosuit utilized by many corporations. It was originally developed to fight in the First Contact War." // CHOMPEdit catalogue_data = list(/datum/category_item/catalogue/technology/durand) icon_state = "durand" movement_cooldown = 3 @@ -70,8 +70,8 @@ return ..() /mob/living/simple_mob/mechanical/mecha/combat/durand/defensive/mercenary - desc = "An aging combat exosuit utilized by many corporations. It was originally developed to fight in the First Contact War.\ - This one has been retrofitted into a turret." + desc = "An aging combat exosuit utilized by many corporations. It was originally developed to fight in the First Contact War.\ + This one has been retrofitted into a turret." // CHOMPEdit projectiletype = /obj/item/projectile/beam/heavylaser/fakeemitter diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm index a4d3883a76..96aa77a299 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm @@ -95,7 +95,7 @@ /mob/living/simple_mob/mechanical/mecha/bullet_act() . = ..() - sparks?.start() + sparks.start() /mob/living/simple_mob/mechanical/mecha/speech_bubble_appearance() return pilot_type ? "" : ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/phazon.dmglass.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/phazon.dmglass.dm deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mechanical.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mechanical.dm index 4d6d47242f..4f2be86faa 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mechanical.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mechanical.dm @@ -13,13 +13,13 @@ min_n2 = 0 max_n2 = 0 minbodytemp = 0 - maxbodytemp = 900 //CHOMP Addition + maxbodytemp = 900 taser_kill = FALSE poison_resist = 1.0 shock_resist = -0.5 - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/mechanical/isSynthetic() return TRUE diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm index fa7d96cf6f..d3ee95a995 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm @@ -3,6 +3,7 @@ //////////////////////////// /mob/living/simple_mob/construct + icon = 'icons/mob/construct.dmi' name = "Construct" real_name = "Construct" desc = "" @@ -64,6 +65,7 @@ can_be_drop_prey = FALSE can_pain_emote = FALSE + ai_holder_type = /datum/ai_holder/simple_mob/melee /mob/living/simple_mob/construct/place_spell_in_hand(var/path) if(!path || !ispath(path)) diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct_ch.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct_ch.dm deleted file mode 100644 index a0b2dcc1e7..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct_ch.dm +++ /dev/null @@ -1,209 +0,0 @@ -//////////////////////////// -// Construct AI -//////////////////////////// - -/mob/living/simple_mob/construct - icon = 'modular_chomp/icons/mob/animal_ch.dmi' - ai_holder_type = /datum/ai_holder/simple_mob/melee - -/mob/living/simple_mob/construct/artificer - ai_holder_type = /datum/ai_holder/mimic - -/mob/living/simple_mob/construct/harvester - ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive - attack_edge = 1 - -/mob/living/simple_mob/construct/juggernaut - ai_holder_type = /datum/ai_holder/simple_mob/destructive - -//////////////////////////// -// Wraith special attack stuff -//////////////////////////// - - -/mob/living/simple_mob/construct/wraith - ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive - var/jaunt_warning = 0.5 SECONDS // How long the jaunt telegraphing is. - var/jaunt_tile_speed = 20 // How long to wait between each tile. Higher numbers result in an easier to dodge tunnel attack. - special_attack_min_range = 2 - special_attack_max_range = 6 - special_attack_cooldown = 10 SECONDS - -/mob/living/simple_mob/construct/wraith/jaunt_spam - special_attack_cooldown = 5 SECONDS - -/mob/living/simple_mob/construct/wraith/fast_jaunt //Teleports behind you - jaunt_tile_speed = 2 - -/mob/living/simple_mob/construct/wraith/do_special_attack(atom/A) - set waitfor = FALSE - set_AI_busy(TRUE) - - // Save where we're gonna go soon. - var/turf/destination = get_turf(A) - var/turf/starting_turf = get_turf(src) - - // Telegraph to give a small window to dodge if really close. - flick("phase_shift",A) - icon_state = "phase_shift" - sleep(jaunt_warning) // For the telegraphing. - - // Do the dig! - visible_message(span_danger("\The [src] vanishes into thin air \the [A]!")) - flick("phase_shift",A) - icon_state = "phase_shift" - - if(handle_jaunt(destination) == FALSE) - set_AI_busy(FALSE) - flick("phase_shift2",A) - icon_state = "phase_shift2" - return FALSE - - // Did we make it? - if(!(src in destination)) - set_AI_busy(FALSE) - icon_state = "phase_shift2" - flick("phase_shift2",A) - return FALSE - - var/overshoot = TRUE - - // Test if something is at destination. - for(var/mob/living/L in destination) - if(L == src) - continue - - visible_message(span_danger("\The [src] appears in a flurry of slashes \the [L]!")) - playsound(L, 'sound/weapons/heavysmash.ogg', 75, 1) - L.add_modifier(/datum/modifier/entangled, 1 SECONDS) //L.Weaken(3) CHOMPedit: Trying to remove hardstuns - overshoot = FALSE - - if(!overshoot) // We hit the target, or something, at destination, so we're done. - set_AI_busy(FALSE) - icon_state = "phase_shift2" - flick("phase_shift2",A) - return TRUE - - // Otherwise we need to keep going. - to_chat(src, span_warning("You overshoot your target!")) - playsound(src, 'sound/weapons/punchmiss.ogg', 75, 1) - var/dir_to_go = get_dir(starting_turf, destination) - for(var/i = 1 to rand(2, 4)) - destination = get_step(destination, dir_to_go) - - if(handle_jaunt(destination) == FALSE) - set_AI_busy(FALSE) - icon_state = "phase_shift2" - flick("phase_shift2",A) - return FALSE - - set_AI_busy(FALSE) - icon_state = "phase_shift2" - flick("phase_shift2",A) - return FALSE - -// Does the jaunt movement -/mob/living/simple_mob/construct/wraith/proc/handle_jaunt(turf/destination) - var/turf/T = get_turf(src) // Hold our current tile. - - // Regular tunnel loop. - for(var/i = 1 to get_dist(src, destination)) - if(stat) - return FALSE // We died or got knocked out on the way. - if(loc == destination) - break // We somehow got there early. - - // Update T. - T = get_step(src, get_dir(src, destination)) - if(T.check_density(ignore_mobs = TRUE)) - to_chat(src, span_critical("You hit something really solid!")) - playsound(src, "punch", 75, 1) - Weaken(5) - add_modifier(/datum/modifier/tunneler_vulnerable, 10 SECONDS) - return FALSE // Hit a wall. - - // Get into the tile. - forceMove(T) - - -/mob/living/simple_mob/construct/wraith/should_special_attack(atom/A) - // Make sure its possible for the wraith to reach the target so it doesn't try to go through a window. - var/turf/destination = get_turf(A) - var/turf/starting_turf = get_turf(src) - var/turf/T = starting_turf - for(var/i = 1 to get_dist(starting_turf, destination)) - if(T == destination) - break - - T = get_step(T, get_dir(T, destination)) - if(T.check_density(ignore_mobs = TRUE)) - return FALSE - return T == destination - - -//////////////////////////// -// Ranged Artificer -//////////////////////////// - -/mob/living/simple_mob/construct/artificer/caster - name = "Artificer" - real_name = "Artificer" - construct_type = "artificer" - desc = "A bulbous construct dedicated to building and maintaining temples to their otherworldly lords. Its central eye glows with unknowable power." - icon_state = "caster_artificer" - icon_living = "caster_artificer" - ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting - projectiletype = /obj/item/projectile/beam/inversion - projectilesound = 'sound/weapons/spiderlunge.ogg' - -//////////////////////////// -// Greater Harvester -//////////////////////////// - -/mob/living/simple_mob/construct/harvester/greater - name = "Greater Harvester" - real_name = "Chosen" - construct_type = "Chosen" - desc = "A infanthomable mass of tentacles and claws ripping and tearing through all that oppose it." - icon_state = "chosen" - icon_living = "chosen" - maxHealth = 100 - health = 100 - melee_damage_lower = 40 //Glass Cannon Mini-Boss/Semi-Boss large. Few hits is enough to end you. - melee_damage_upper = 50 - attack_armor_pen = 60 //No Armor Shall Save you - attack_sharp = 1 - attack_edge = 1 - attacktext = list("violently stabbed") - friendly = list("caresses") - movement_cooldown = 0 - - ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive - - // environment_smash = 1 // Whatever this gets renamed to, Harvesters need to break things - - attack_sound = 'sound/weapons/pierce.ogg' - -//////////////////////////// -// Artificer -//////////////////////////// - -/mob/living/simple_mob/construct/proteon //Weak Swarm Attacker can be safely dumped on players in large numbers without too many injuries - name = "Proteon" - real_name = "proton" - construct_type = "artificer" - desc = "A weak but speedy construction designed to assist other constructs rather than fight. Still seems bloodthirtsy though." - icon_state = "proteon" - icon_living = "proteon" - maxHealth = 50 - health = 50 - response_harm = "viciously beaten" - harm_intent_damage = 5 - melee_damage_lower = 8 //It's not the strongest of the bunch, but that doesn't mean it can't hurt you. - melee_damage_upper = 10 - attack_armor_pen = 50 // Does so little damage already, that this can be justified. - attacktext = list("rammed") - attack_sound = 'sound/weapons/rapidslice.ogg' - movement_cooldown = 0 - - ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/artificer.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/artificer.dm index dec6c4f0f3..24167969ba 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/artificer.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/artificer.dm @@ -7,11 +7,12 @@ real_name = "Artificer" construct_type = "artificer" desc = "A bulbous construct dedicated to building and maintaining temples to their otherworldly lords." - //icon = 'icons/mob/mob.dmi' //CHOMPEdit icon_state = "artificer" icon_living = "artificer" - maxHealth = 100 //CHOMPEdit - Adjusting values since they have AI now - health = 100 //CHOMPEdit + // CHOMPEdit Start + maxHealth = 100 + health = 100 + // CHOMPEdit End response_harm = "viciously beaten" harm_intent_damage = 5 melee_damage_lower = 15 //It's not the strongest of the bunch, but that doesn't mean it can't hurt you. @@ -29,6 +30,47 @@ /spell/targeted/occult_repair_aura, /spell/targeted/construct_advanced/mend_acolyte ) + ai_holder_type = /datum/ai_holder/mimic /decl/mob_organ_names/artificer hit_zones = list("body", "carapace", "right manipulator", "left manipulator", "upper left appendage", "upper right appendage", "eye") + +//////////////////////////// +// Ranged Artificer +//////////////////////////// + +/mob/living/simple_mob/construct/artificer/caster + name = "Artificer" + real_name = "Artificer" + construct_type = "artificer" + desc = "A bulbous construct dedicated to building and maintaining temples to their otherworldly lords. Its central eye glows with unknowable power." + icon_state = "caster_artificer" + icon_living = "caster_artificer" + ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting + projectiletype = /obj/item/projectile/energy/inversion + projectiletype = /obj/item/projectile/beam/inversion + projectilesound = 'sound/weapons/spiderlunge.ogg' + +//////////////////////////// +// Artificer +//////////////////////////// + +/mob/living/simple_mob/construct/proteon //Weak Swarm Attacker can be safely dumped on players in large numbers without too many injuries + name = "Proteon" + real_name = "proton" + construct_type = "artificer" + desc = "A weak but speedy construction designed to assist other constructs rather than fight. Still seems bloodthirtsy though." + icon_state = "proteon" + icon_living = "proteon" + maxHealth = 50 + health = 50 + response_harm = "viciously beaten" + harm_intent_damage = 5 + melee_damage_lower = 8 //It's not the strongest of the bunch, but that doesn't mean it can't hurt you. + melee_damage_upper = 10 + attack_armor_pen = 50 // Does so little damage already, that this can be justified. + attacktext = list("rammed") + attack_sound = 'sound/weapons/rapidslice.ogg' + movement_cooldown = 0 + + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/bishop.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/bishop.dm new file mode 100644 index 0000000000..97f4d628b4 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/bishop.dm @@ -0,0 +1,74 @@ +//////////////////////////// +// Purity Construct - Bishop +//////////////////////////// + +/mob/living/simple_mob/construct/bishop + name = "Bishop" + real_name = "Bishop" + construct_type = "Bishop" + faction = "purity" + desc = "A medium sized construct of the purity worshippers mechanical followers, sturdy and deadly, these constructs are commanded by an archbishop, tasked with patrolling and eliminating threats to their flock." + icon_state = "bishop" + icon_living = "bishop" + ui_icons = 'icons/mob/screen1_purity.dmi' + maxHealth = 250 + health = 250 + melee_damage_lower = 15 + melee_damage_upper = 20 + attack_armor_pen = 15 + attack_sharp = TRUE + attack_edge = 1 + attacktext = list("slashed") + friendly = list("pinches") + organ_names = /decl/mob_organ_names/wraith + movement_cooldown = -1 + attack_sound = 'sound/weapons/rapidslice.ogg' + construct_spells = list(/spell/targeted/construct_advanced/crippling_beam, + /spell/targeted/construct_advanced/banishment + ) + + ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative + +// environment_smash = 1 // Whatever this gets renamed to, Wraiths need to break things + +/mob/living/simple_mob/construct/bishop/apply_melee_effects(var/atom/A) + if(isliving(A)) + var/mob/living/L = A + L.add_modifier(/datum/modifier/deep_wounds, 30 SECONDS) + +/decl/mob_organ_names/wraith + hit_zones = list("body", "eye", "crystaline spike", "left claw", "right claw") + +//////////////////////////// +// Purity Construct - Archbishop +//////////////////////////// + +/mob/living/simple_mob/construct/bishop/arch + name = "Archbishop" + real_name = "Archbishop" + construct_type = "Archbishop" + faction = "purity" + desc = "A large sized construct of the purity worshippers mechanical followers, one of their most advanced, it is the right hand of purification, dedicated to the pursuit of eradicating those who cause harm their charge." + icon_state = "archbishop" + icon_living = "archbishop" + ui_icons = 'icons/mob/screen1_purity.dmi' + maxHealth = 200 + health = 200 + melee_damage_lower = 20 //hits much harder then most purity constructs + melee_damage_upper = 30 + attack_armor_pen = 50 //armor is no match against its religious wrath + attack_sharp = 1 + attack_edge = 1 + attacktext = list("violently stabbed") + friendly = list("caresses") + organ_names = /decl/mob_organ_names/wraith + movement_cooldown = 0 + + ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative + + // environment_smash = 1 // Whatever this gets renamed to, Harvesters need to break things + + attack_sound = 'sound/weapons/pierce.ogg' + +/decl/mob_organ_names/wraith + hit_zones = list("body", "eye", "crystaline spike", "left claw", "right claw") diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/cardinal.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/cardinal.dm new file mode 100644 index 0000000000..55300b0c9e --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/cardinal.dm @@ -0,0 +1,91 @@ +//////////////////////////// +// Purity Construct - Cardinal +//////////////////////////// + +/mob/living/simple_mob/construct/cardinal + name = "Cardinal" + real_name = "Cardinal" + construct_type = "Cardinal" + faction = "purity" + desc = "A large sized construct of the purity worshippers mechanical followers, one of their most advanced, it is the left hand of purification, tasked with the ultimate protection and ultimately defense of all under its charge, it will stop at nothing to protect its flock from harm." + icon_state = "cardinal" + icon_living = "cardinal" + ui_icons = 'icons/mob/screen1_purity.dmi' + maxHealth = 300 + health = 300 + response_harm = "harmlessly punches" + harm_intent_damage = 0 + melee_damage_lower = 20 + melee_damage_upper = 30 + attack_armor_pen = 50 //fist of iron and stone will smash through most things + attacktext = list("smashed their armoured gauntlet into") + friendly = list("pats") + organ_names = /decl/mob_organ_names/juggernaut + mob_size = MOB_HUGE + attack_sound = 'sound/weapons/heavysmash.ogg' + status_flags = 0 + resistance = 10 + construct_spells = list(/spell/targeted/fortify, + /spell/targeted/construct_advanced/slam, + /spell/targeted/construct_advanced/mend_purity, + /spell/targeted/purity_repair_aura + ) + + ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative + + armor = list( + "melee" = 70, + "bullet" = 30, + "laser" = 30, + "energy" = 30, + "bomb" = 10, + "bio" = 100, + "rad" = 100) + +/mob/living/simple_mob/construct/cardinal/Life() + SetWeakened(0) + ..() + +/mob/living/simple_mob/construct/cardinal/bullet_act(var/obj/item/projectile/P) + var/reflectchance = 100 - round(P.damage) + if(prob(reflectchance)) + var/damage_mod = rand(2,4) + var/projectile_dam_type = P.damage_type + var/incoming_damage = (round(P.damage / damage_mod) - (round((P.damage / damage_mod) * 0.3))) + var/armorcheck = run_armor_check(null, P.check_armour) + var/soakedcheck = get_armor_soak(null, P.check_armour) + if(!(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))) + visible_message(span_danger("The [P.name] bounces off of [src]'s shell!"), \ + span_userdanger("The [P.name] bounces off of [src]'s shell!")) + new /obj/item/material/shard/shrapnel(src.loc) + if(!(P.damage_type == BRUTE || P.damage_type == BURN)) + projectile_dam_type = BRUTE + incoming_damage = round(incoming_damage / 4) //Damage from strange sources is converted to brute for physical projectiles, though severely decreased. + apply_damage(incoming_damage, projectile_dam_type, null, armorcheck, soakedcheck, is_sharp(P), has_edge(P), P) + return -1 //Doesn't reflect non-beams or non-energy projectiles. They just smack and drop with little to no effect. + else + visible_message(span_danger("The [P.name] gets reflected by [src]'s shell!"), \ + span_userdanger("The [P.name] gets reflected by [src]'s shell!")) + damage_mod = rand(3,5) + incoming_damage = (round(P.damage / damage_mod) - (round((P.damage / damage_mod) * 0.3))) + if(!(P.damage_type == BRUTE || P.damage_type == BURN)) + projectile_dam_type = BURN + incoming_damage = round(incoming_damage / 4) //Damage from strange sources is converted to burn for energy-type projectiles, though severely decreased. + apply_damage(incoming_damage, P.damage_type, null, armorcheck, soakedcheck, is_sharp(P), has_edge(P), P) + + // Find a turf near or on the original location to bounce to + if(P.starting) + var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) + var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) + var/turf/curloc = get_turf(src) + + // redirect the projectile + P.redirect(new_x, new_y, curloc, src) + P.reflected = 1 + + return -1 // complete projectile permutation + + return (..(P)) + +/decl/mob_organ_names/juggernaut + hit_zones = list("body", "left pauldron", "right pauldron", "left arm", "right arm", "eye", "head", "crystaline spike") diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/deacon.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/deacon.dm new file mode 100644 index 0000000000..4529de17ad --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/deacon.dm @@ -0,0 +1,48 @@ +//////////////////////////// +// Purity Construct - Deacon +//////////////////////////// + +/mob/living/simple_mob/construct/deacon + name = "Deacon" + real_name = "Deacon" + construct_type = "Deacon" + faction = "purity" + desc = "A small construct of the purity worshippers mechanical followers, hardy but mostly harmless." + icon_state = "deacon" + icon_living = "deacon" + ui_icons = 'icons/mob/screen1_purity.dmi' + maxHealth = 150 + health = 150 + melee_damage_lower = 8 //not meant for combat but can hold its own in a pinch + melee_damage_upper = 12 + attack_armor_pen = 60 //used to carve stone and other metals, cuts through armor just as well + attack_sharp = 1 + attack_edge = 1 + attacktext = list("violently stabbed") + friendly = list("caresses") + organ_names = /decl/mob_organ_names/harvester + movement_cooldown = -1 + + ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative + + // environment_smash = 1 // Whatever this gets renamed to, Harvesters need to break things + + attack_sound = 'sound/weapons/pierce.ogg' + + armor = list( + "melee" = 20, + "bullet" = 10, + "laser" = 10, + "energy" = 10, + "bomb" = 10, + "bio" = 100, + "rad" = 100) + + construct_spells = list( + /spell/aoe_turf/knock/harvester, + /spell/targeted/construct_advanced/force_beam, + /spell/targeted/construct_advanced/soothing_sphere, + ) + +/decl/mob_organ_names/harvester + hit_zones = list("cephalothorax", "eye", "carapace", "energy crystal", "mandible") diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/harvester.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/harvester.dm index a2ae87d39a..aef2d7bea6 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/harvester.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/harvester.dm @@ -7,11 +7,8 @@ real_name = "Harvester" construct_type = "harvester" desc = "A tendril-laden construct piloted by a chained mind." - //icon = 'icons/mob/mob.dmi' CHOMPEdit icon_state = "harvester" icon_living = "harvester" - maxHealth = 100 //CHOMPEdit - health = 100 //CHOMPEdit melee_damage_lower = 20 melee_damage_upper = 25 attack_sharp = TRUE @@ -39,6 +36,34 @@ /spell/targeted/construct_advanced/agonizing_sphere, /spell/rune_write ) + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive + attack_edge = TRUE /decl/mob_organ_names/harvester hit_zones = list("cephalothorax", "eye", "carapace", "energy crystal", "mandible") + +//////////////////////////// +// Greater Harvester +//////////////////////////// + +/mob/living/simple_mob/construct/harvester/greater + name = "Greater Harvester" + real_name = "Chosen" + construct_type = "Chosen" + desc = "A infanthomable mass of tentacles and claws ripping and tearing through all that oppose it." + icon_state = "chosen" + icon_living = "chosen" + maxHealth = 100 + health = 100 + melee_damage_lower = 40 //Glass Cannon Mini-Boss/Semi-Boss large. Few hits is enough to end you. + melee_damage_upper = 50 + attack_armor_pen = 60 //No Armor Shall Save you + attack_sharp = 1 + attack_edge = 1 + attacktext = list("violently stabbed") + friendly = list("caresses") + movement_cooldown = 0 + + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive + + attack_sound = 'sound/weapons/pierce.ogg' diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/juggernaut.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/juggernaut.dm index 31dba5e788..ada4af8262 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/juggernaut.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/juggernaut.dm @@ -10,8 +10,10 @@ icon = 'icons/mob/mob.dmi' icon_state = "behemoth" icon_living = "behemoth" - maxHealth = 200 //CHOMPEdit - health = 200 //CHOMPEdit + // CHOMPEdit Start + maxHealth = 200 + health = 200 + // CHOMPEdit End response_harm = "harmlessly punches" harm_intent_damage = 0 melee_damage_lower = 30 @@ -44,13 +46,14 @@ "bomb" = 10, "bio" = 100, "rad" = 100) + ai_holder_type = /datum/ai_holder/simple_mob/destructive /mob/living/simple_mob/construct/juggernaut/Life() SetWeakened(0) ..() /mob/living/simple_mob/construct/juggernaut/bullet_act(var/obj/item/projectile/P) - var/reflectchance = 100 - round(P.damage*2) //chompEDIT: We have lower damage values now + var/reflectchance = 100 - round(P.damage*2) // CHOMPEdit: We have lower damage values now if(prob(reflectchance)) var/damage_mod = rand(2,4) var/projectile_dam_type = P.damage_type @@ -98,8 +101,10 @@ name = "Behemoth" real_name = "Behemoth" desc = "The pinnacle of occult technology, Behemoths are nothing shy of both an Immovable Object, and Unstoppable Force." - maxHealth = 600 //CHOMPEdit - health = 600 //CHOMPEdit + // CHOMPEdit Start + maxHealth = 600 + health = 600 + // CHOMPEdit End speak_emote = list("rumbles") melee_damage_lower = 50 melee_damage_upper = 50 @@ -125,7 +130,7 @@ ) /mob/living/simple_mob/construct/juggernaut/behemoth/bullet_act(var/obj/item/projectile/P) - var/reflectchance = 100 - round(P.damage*2) //chompEDIT: We have lower damage values now + var/reflectchance = 100 - round(P.damage*2) //CHOMPEdit: We have lower damage values now if(prob(reflectchance)) visible_message(span_danger("The [P.name] gets reflected by [src]'s shell!"), \ span_userdanger("The [P.name] gets reflected by [src]'s shell!")) @@ -146,3 +151,45 @@ /decl/mob_organ_names/juggernaut hit_zones = list("body", "left pauldron", "right pauldron", "left arm", "right arm", "eye", "head", "crystaline spike") + +/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable + name = "Behemoth" + real_name = "Behemoth" + desc = "The pinnacle of occult technology, Behemoths are nothing shy of both an Immovable Object, and Unstoppable Force." + melee_damage_lower = 45 + melee_damage_upper = 65 + ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax + projectiletype = /obj/item/projectile/energy/inversion + movement_cooldown = 1 + + // loot_list = list(/obj/item/rig/ch/aegis = 100) // Downstream only + + +/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable/bullet_act(var/obj/item/projectile/P) + var/reflectchance = 100 - round(P.damage*2) + if(prob(reflectchance)) + visible_message(span_danger("The [P.name] gets reflected by [src]'s shell!"), \ + span_userdanger("The [P.name] gets reflected by [src]'s shell!")) + + // Find a turf near or on the original location to bounce to + if(P.starting) + var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) + var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) + var/turf/curloc = get_turf(src) + + // redirect the projectile + P.redirect(new_x, new_y, curloc, src) + P.reflected = 1 + + return -1 // complete projectile permutation + + return (..(P)) + + +/obj/item/projectile/energy/electrode/cult + color = "#FFFFFF" + agony = 0 + damage = 15 + damage_type = BURN + check_armour = "laser" + armor_penetration = 60 diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/laity.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/laity.dm new file mode 100644 index 0000000000..502936aece --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/laity.dm @@ -0,0 +1,25 @@ +//////////////////////////// +// Purity Construct - Laity +//////////////////////////// + +/mob/living/simple_mob/construct/laity //Weak Swarm Attacker can be safely dumped on players in large numbers without too many injuries + name = "Laity" + real_name = "Laity" + construct_type = "Laity" + faction = "purity" + desc = "A small construct of the purity worshippers mechanical followers, not hardy or particularly strong, very numerous." + icon_state = "laity" + icon_living = "laity" + ui_icons = 'icons/mob/screen1_purity.dmi' + maxHealth = 75 + health = 75 + response_harm = "viciously beaten" + harm_intent_damage = 5 + melee_damage_lower = 4 //It's not the strongest of the bunch, but that doesn't mean it can't hurt you. + melee_damage_upper = 8 + attack_armor_pen = 50 // Does so little damage already, that this can be justified. + attacktext = list("rammed") + attack_sound = 'sound/weapons/rapidslice.ogg' + movement_cooldown = 0 + + ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/priest.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/priest.dm new file mode 100644 index 0000000000..faf5efd1d3 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/priest.dm @@ -0,0 +1,30 @@ +//////////////////////////// +// Purity Construct - Priest +//////////////////////////// + +/mob/living/simple_mob/construct/priest + name = "Priest" + real_name = "Priest" + construct_type = "Priest" + faction = "purity" + desc = "A medium sized construct of the purity worshippers mechanical followers, sturdy but lacking strength." + icon_state = "priest" + icon_living = "priest" + ui_icons = 'icons/mob/screen1_purity.dmi' + maxHealth = 200 + health = 200 + response_harm = "viciously beaten" + harm_intent_damage = 5 + melee_damage_lower = 10 //It's not the strongest of the bunch, but that doesn't mean it can't hurt you. + melee_damage_upper = 15 + organ_names = /decl/mob_organ_names/artificer + attacktext = list("rammed") + attack_sound = 'sound/weapons/rapidslice.ogg' + construct_spells = list(/spell/targeted/purity_repair_aura, + /spell/targeted/construct_advanced/mend_purity + ) + + ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative + +/decl/mob_organ_names/artificer + hit_zones = list("body", "carapace", "right manipulator", "left manipulator", "upper left appendage", "upper right appendage", "eye") diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/shade.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/shade.dm index ba689a5c57..f315627be9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/shade.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/shade.dm @@ -6,7 +6,6 @@ name = "Shade" real_name = "Shade" desc = "A bound spirit" - //icon = 'icons/mob/mob.dmi' CHOMPRemove icon_state = "shade" icon_living = "shade" icon_dead = "shade_dead" diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/wraith.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/wraith.dm index 1c9ad2db84..59321cd28c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/wraith.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/wraith.dm @@ -7,7 +7,6 @@ real_name = "Wraith" construct_type = "wraith" desc = "A wicked bladed shell contraption piloted by a bound spirit." - //icon = 'icons/mob/mob.dmi' //CHOMPRemove icon_state = "floating" icon_living = "floating" maxHealth = 200 @@ -25,6 +24,12 @@ construct_spells = list(/spell/targeted/ethereal_jaunt/shift, /spell/targeted/ambush_mode ) + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive + var/jaunt_warning = 0.5 SECONDS // How long the jaunt telegraphing is. + var/jaunt_tile_speed = 20 // How long to wait between each tile. Higher numbers result in an easier to dodge tunnel attack. + special_attack_min_range = 2 + special_attack_max_range = 6 + special_attack_cooldown = 10 SECONDS // environment_smash = 1 // Whatever this gets renamed to, Wraiths need to break things @@ -35,3 +40,118 @@ /decl/mob_organ_names/wraith hit_zones = list("body", "eye", "crystaline spike", "left claw", "right claw") + +/mob/living/simple_mob/construct/wraith/jaunt_spam + special_attack_cooldown = 5 SECONDS + +/mob/living/simple_mob/construct/wraith/fast_jaunt //Teleports behind you + jaunt_tile_speed = 2 + +//////////////////////////// +// Wraith special attack stuff +//////////////////////////// + +/mob/living/simple_mob/construct/wraith/do_special_attack(atom/A) + set waitfor = FALSE + set_AI_busy(TRUE) + + // Save where we're gonna go soon. + var/turf/destination = get_turf(A) + var/turf/starting_turf = get_turf(src) + + // Telegraph to give a small window to dodge if really close. + flick("phase_shift",A) + icon_state = "phase_shift" + sleep(jaunt_warning) // For the telegraphing. + + // Do the dig! + visible_message(span_danger("\The [src] vanishes into thin air \the [A]!")) + flick("phase_shift",A) + icon_state = "phase_shift" + + if(handle_jaunt(destination) == FALSE) + set_AI_busy(FALSE) + flick("phase_shift2",A) + icon_state = "phase_shift2" + return FALSE + + // Did we make it? + if(!(src in destination)) + set_AI_busy(FALSE) + icon_state = "phase_shift2" + flick("phase_shift2",A) + return FALSE + + var/overshoot = TRUE + + // Test if something is at destination. + for(var/mob/living/L in destination) + if(L == src) + continue + + visible_message(span_danger("\The [src] appears in a flurry of slashes \the [L]!")) + playsound(L, 'sound/weapons/heavysmash.ogg', 75, 1) + L.add_modifier(/datum/modifier/entangled, 1 SECONDS) + overshoot = FALSE + + if(!overshoot) // We hit the target, or something, at destination, so we're done. + set_AI_busy(FALSE) + icon_state = "phase_shift2" + flick("phase_shift2",A) + return TRUE + + // Otherwise we need to keep going. + to_chat(src, span_warning("You overshoot your target!")) + playsound(src, 'sound/weapons/punchmiss.ogg', 75, 1) + var/dir_to_go = get_dir(starting_turf, destination) + for(var/i = 1 to rand(2, 4)) + destination = get_step(destination, dir_to_go) + + if(handle_jaunt(destination) == FALSE) + set_AI_busy(FALSE) + icon_state = "phase_shift2" + flick("phase_shift2",A) + return FALSE + + set_AI_busy(FALSE) + icon_state = "phase_shift2" + flick("phase_shift2",A) + return FALSE + +// Does the jaunt movement +/mob/living/simple_mob/construct/wraith/proc/handle_jaunt(turf/destination) + var/turf/T = get_turf(src) // Hold our current tile. + + // Regular tunnel loop. + for(var/i = 1 to get_dist(src, destination)) + if(stat) + return FALSE // We died or got knocked out on the way. + if(loc == destination) + break // We somehow got there early. + + // Update T. + T = get_step(src, get_dir(src, destination)) + if(T.check_density(ignore_mobs = TRUE)) + to_chat(src, span_critical("You hit something really solid!")) + playsound(src, "punch", 75, 1) + Weaken(5) + add_modifier(/datum/modifier/tunneler_vulnerable, 10 SECONDS) + return FALSE // Hit a wall. + + // Get into the tile. + forceMove(T) + + +/mob/living/simple_mob/construct/wraith/should_special_attack(atom/A) + // Make sure its possible for the wraith to reach the target so it doesn't try to go through a window. + var/turf/destination = get_turf(A) + var/turf/starting_turf = get_turf(src) + var/turf/T = starting_turf + for(var/i = 1 to get_dist(starting_turf, destination)) + if(T == destination) + break + + T = get_step(T, get_dir(T, destination)) + if(T.check_density(ignore_mobs = TRUE)) + return FALSE + return T == destination diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/creature.dm b/code/modules/mob/living/simple_mob/subtypes/occult/creature.dm index 80201c3610..c2b7d0dcbf 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/creature.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/creature.dm @@ -33,8 +33,8 @@ can_pain_emote = FALSE - can_be_drop_prey = FALSE //CHOMP Add - can_pain_emote = FALSE // CHOMPEdit: Can't feel pain + can_be_drop_prey = FALSE + can_pain_emote = FALSE // Strong Variant /mob/living/simple_mob/creature/strong diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm b/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm index 34459501c8..16f8ce4377 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm @@ -48,14 +48,14 @@ /mob/living/simple_mob/faithless/Process_Spacemove(var/check_drift = 0) return 1 -/*chompedit: Trying to remove mob hardstuns +/* CHOMPRemove Start, no hardstuns /mob/living/simple_mob/faithless/apply_melee_effects(var/atom/A) if(isliving(A)) var/mob/living/L = A if(prob(12)) L.Weaken(3) L.visible_message(span_danger("\The [src] knocks down \the [L]!")) -*/ +*/// CHOMPRemove End // Strong Variant /mob/living/simple_mob/faithless/strong diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm index b108b1a1d1..f9c11a0263 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm @@ -82,13 +82,11 @@ var/list/_slime_default_emotes = list( can_enter_vent_with = list(/obj/item/clothing/head, /obj/soulgem) - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE - // CHOMPAdd: Pain Sounds species_sounds = "Slime" pain_emote_1p = list("squish", "squelch") pain_emote_3p = list("squishes", "squelches") - // CHOMPAdd End /mob/living/simple_mob/slime/get_available_emotes() return global._slime_default_emotes.Copy() diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm index bb6fac4e0d..eab5013eb9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm @@ -417,8 +417,8 @@ L.throw_at(get_edge_target_turf(L, throwdir), 3, 1, src) else to_chat(L, span_warning("\The [src] hits you with incredible force, but you remain in place.")) - visible_message(span_danger("\The [src] hits \the [L] with incredible force, to no visible effect!")) // CHOMPEdit: Visible/audible feedback for *resisting* the slam. - playsound(src, "punch", 50, 1) // CHOMPEdit: Visible/audible feedback for *resisting* the slam. + 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/slime/xenobio/amber @@ -582,10 +582,10 @@ var/mob/living/carbon/human/H = holder for(var/obj/item/organ/external/E in H.organs) var/obj/item/organ/external/O = E - O.heal_damage(1, 1, 0, 1) //CHOMPEdit, heal halved + O.heal_damage(1, 1, 0, 1) else - holder.adjustBruteLoss(-1) //CHOMPEdit, heal halved - holder.adjustFireLoss(-1) //CHOMPEdit, heal halved + holder.adjustBruteLoss(-1) + holder.adjustFireLoss(-1) holder.adjustToxLoss(-2) holder.adjustOxyLoss(-2) @@ -789,7 +789,6 @@ pacify() // So the physical mob also gets made harmless. return ..() -//ChompAdd Begins // A pacified pink slime for either Admin-spawning or putting in a casino reward or capture crystal. /mob/living/simple_mob/slime/xenobio/pink/sana name = "Sana" @@ -800,4 +799,3 @@ /mob/living/simple_mob/slime/xenobio/pink/sana/Initialize(mapload) pacify() // So the physical mob also gets made harmless. return ..() -//ChompAdd End diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm index 69bb146f85..fd8df9a601 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm @@ -10,8 +10,8 @@ var/power_charge = 0 // Disarm attacks can shock someone if high/lucky enough. var/mob/living/victim = null // the person the slime is currently feeding on var/rainbow_core_candidate = TRUE // If false, rainbow cores cannot make this type randomly. - var/mutation_chance = 30 // CHOMPedit Odds of spawning as a new color when reproducing. Can be modified by certain xenobio products. Carried across generations of slimes. - var/split_amount = 5 //Chompedit: increased from 4 to 5 to make xenobio faster and deadlier. Amount of children we will normally have. Half of that for dead adult slimes. Is NOT carried across generations. + var/mutation_chance = 30 // Odds of spawning as a new color when reproducing. Can be modified by certain xenobio products. Carried across generations of slimes.// CHOMPEdit + var/split_amount = 5 // Amount of children we will normally have. Half of that for dead adult slimes. Is NOT carried across generations. // CHOMPEdit var/untamable = FALSE //Makes slime untamable via discipline. var/untamable_inheirit = FALSE //Makes slime inheirit its untamability. var/list/slime_mutation = list( diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm index d6a4c28613..b8b9466b28 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm @@ -54,14 +54,14 @@ I think I covered everything. catalogue_data = list(/datum/category_item/catalogue/fauna/bigdragon) tt_desc = "S Draco Ignis" icon = 'icons/mob/vore128x64.dmi' - icon_state = "dragon_bodyScaled" //CHOMPEdit - So mappers can see it. Gets removed in Initialize() + icon_state = "dragon_bodyScaled" icon_rest = "dragon_maneNone" icon_living = "dragon_maneNone" player_msg = "You can perform a charge attack by disarm intent clicking somewhere. Grab intent clicking will perform a tail sweep and fling any nearby mobs. You can fire breath with harm intent. Your attacks have cooldowns associated with them. You can heal slowly by resting. Check your abilities tab for other functions!" meat_amount = 40 meat_type = /obj/item/reagent_containers/food/snacks/meat - pixel_x = -48 //CHOMPEdit - default_pixel_x = -48 //CHOMPEdit + pixel_x = -48 + default_pixel_x = -48 old_x = -48 old_y = 0 vis_height = 92 @@ -103,12 +103,14 @@ I think I covered everything. say_list_type = /datum/say_list/bigdragon devourable = 0 //No universal_understand = 1 //So they can hear synth speach + max_tox = 0 // for virgo3b survivability + max_co2 = 0 // Also needed for 3b Survivability otherwise it chokes to death special_attack_min_range = 1 special_attack_max_range = 10 special_attack_cooldown = 80 - plane = MOB_PLANE //CHOMPEdit + plane = MOB_PLANE //Dragon vars var/notame @@ -182,6 +184,8 @@ I think I covered everything. ) var/eyes + can_be_drop_prey = FALSE + /// /// Subtypes /// @@ -204,6 +208,7 @@ I think I covered everything. maxHealth = 200 melee_damage_lower = 20 melee_damage_upper = 15 + allow_mind_transfer = TRUE /// /// Misc define stuff @@ -247,8 +252,8 @@ I think I covered everything. add_verb(src, /mob/living/simple_mob/vore/bigdragon/proc/sprite_toggle) add_verb(src, /mob/living/simple_mob/vore/bigdragon/proc/flame_toggle) add_verb(src, /mob/living/simple_mob/vore/bigdragon/proc/special_toggle) - //add_verb(src, /mob/living/simple_mob/vore/bigdragon/proc/set_name) //Implemented upstream - //add_verb(src, /mob/living/simple_mob/vore/bigdragon/proc/set_desc) //Implemented upstream + add_verb(src,/mob/living/simple_mob/vore/bigdragon/proc/export_style) + add_verb(src,/mob/living/simple_mob/vore/bigdragon/proc/import_style) faction = FACTION_NEUTRAL /mob/living/simple_mob/vore/bigdragon/Initialize(mapload) @@ -258,7 +263,7 @@ I think I covered everything. add_language(LANGUAGE_DRUDAKAR) add_language(LANGUAGE_UNATHI) mob_radio = new /obj/item/radio/headset/mob_headset(src) //We always give radios to spawned mobs anyway - icon_state = "dragon_maneNone" //CHOMPEdit + icon_state = "dragon_maneNone" /mob/living/simple_mob/vore/bigdragon/MouseDrop_T(mob/living/M, mob/living/user) return @@ -353,55 +358,55 @@ I think I covered everything. eyes = pick(eye_styles) overlay_colors["Eyes"] = get_random_colour(1) - var/image/I = image(icon, "dragon_under[under][resting? "-rest" : (vore_fullness? "-[vore_fullness]" : null)]") //CHOMPEdit + var/image/I = image(icon, "dragon_under[under][resting? "-rest" : (vore_fullness? "-[vore_fullness]" : null)]") I.color = overlay_colors["Underbelly"] I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) I.plane = MOB_PLANE I.layer = MOB_LAYER add_overlay(I) - I = image(icon, "dragon_body[body][resting? "-rest" : null]") //CHOMPEdit + I = image(icon, "dragon_body[body][resting? "-rest" : null]") I.color = overlay_colors["Body"] I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) I.plane = MOB_PLANE I.layer = MOB_LAYER add_overlay(I) - I = image(icon, "dragon_ears[ears][resting? "-rest" : null]") //CHOMPEdit + I = image(icon, "dragon_ears[ears][resting? "-rest" : null]") I.color = overlay_colors["Ears"] I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) I.plane = MOB_PLANE I.layer = MOB_LAYER add_overlay(I) - I = image(icon, "dragon_mane[mane][resting? "-rest" : null]") //CHOMPEdit + I = image(icon, "dragon_mane[mane][resting? "-rest" : null]") I.color = overlay_colors["Mane"] I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) I.plane = MOB_PLANE I.layer = MOB_LAYER add_overlay(I) - I = image(icon, "dragon_horns[horns][resting? "-rest" : null]") //CHOMPEdit + I = image(icon, "dragon_horns[horns][resting? "-rest" : null]") I.color = overlay_colors["Horns"] I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) I.plane = MOB_PLANE I.layer = MOB_LAYER add_overlay(I) - I = image(icon, "dragon_eyes[eyes][resting? "-rest" : null]") //CHOMPEdit + I = image(icon, "dragon_eyes[eyes][resting? "-rest" : null]") I.color = overlay_colors["Eyes"] I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) I.plane = PLANE_LIGHTING_ABOVE add_overlay(I) if(enraged) - I = image(icon, "dragon_rage") //CHOMPEdit + I = image(icon, "dragon_rage") I.appearance_flags |= PIXEL_SCALE I.plane = MOB_PLANE I.layer = MOB_LAYER add_overlay(I) if(flames) - I = image(icon, "dragon_flame[resting? "-rest" : null]") //CHOMPEdit + I = image(icon, "dragon_flame[resting? "-rest" : null]") I.appearance_flags |= PIXEL_SCALE I.plane = PLANE_LIGHTING_ABOVE add_overlay(I) @@ -564,7 +569,7 @@ I think I covered everything. /obj/belly/dragon autotransferchance = 50 autotransferwait = 150 - autotransfer_enabled = TRUE // CHOMPAdd + autotransfer_enabled = TRUE escapable = TRUE escapechance = 100 escapetime = 15 @@ -572,7 +577,7 @@ I think I covered everything. contamination_color = "grey" contamination_flavor = "Wet" vore_verb = "slurp" - belly_fullscreen_color = "#711e1e" //CHOMPedit + belly_fullscreen_color = "#711e1e" /obj/belly/dragon/maw name = "Maw" @@ -926,7 +931,7 @@ I think I covered everything. if(H.will_eat(P)) if(issilicon(P)) return - if(!iscarbon(P)) //CHOMPEdit. Makes healbelly mobs target synths now. Man.. feels weird writing chompedit on my own code from chomp. + if(!iscarbon(P)) //Makes healbelly mobs target synths now. if(!P.client) //Don't target simple mobs that aren't player controlled return if(P.stat == DEAD) @@ -1065,3 +1070,63 @@ I think I covered everything. if(istype(holder,/mob/living/simple_mob/vore/bigdragon)) var/mob/living/simple_mob/vore/bigdragon/H = holder H.chargeend(chump,1,1) + +/mob/living/simple_mob/vore/bigdragon/proc/export_style() + set name = "Export style string" + set desc = "Export a string of text that can be used to instantly get the current style back using the import style verb" + set category = "Abilities.Settings" + var/output_style = jointext(list( + overlay_colors["Underbelly"], + under, + overlay_colors["Body"], + body, + overlay_colors["Ears"], + ears, + overlay_colors["Mane"], + mane, + overlay_colors["Horns"], + horns, + overlay_colors["Eyes"], + eyes), ";") + to_chat(src, span_notice("Exported style string is \" [output_style] \". Use this to get the same style in the future with import style")) + +/mob/living/simple_mob/vore/bigdragon/proc/import_style() + set name = "Import style string" + set desc = "Import a string of text that was made using the import style verb to get back that style" + set category = "Abilities.Settings" + var/input_style + input_style = sanitizeSafe(tgui_input_text(src,"Paste the style string you exported with Export Style.", "Style loading")) + if(input_style) + var/list/input_style_list = splittext(input_style, ";") + if((LAZYLEN(input_style_list) == 12) && (input_style_list[2] in underbelly_styles) && (input_style_list[4] in body_styles) && (input_style_list[6] in ear_styles) && (input_style_list[8] in mane_styles) && (input_style_list[10] in horn_styles) && (input_style_list[12] in ear_styles)) + try + if(rgb2num(input_style_list[1])) + overlay_colors["Underbelly"] = input_style_list[1] + catch + under = input_style_list[2] + try + if(rgb2num(input_style_list[3])) + overlay_colors["Body"] = input_style_list[3] + catch + body = input_style_list[4] + try + if(rgb2num(input_style_list[5])) + overlay_colors["Ears"] = input_style_list[5] + catch + ears = input_style_list[6] + try + if(rgb2num(input_style_list[7])) + overlay_colors["Mane"] = input_style_list[7] + catch + mane = input_style_list[8] + try + if(rgb2num(input_style_list[9])) + overlay_colors["Horns"] = input_style_list[9] + catch + horns = input_style_list[10] + try + if(rgb2num(input_style_list[11])) + overlay_colors["Eyes"] = input_style_list[11] + catch + eyes = input_style_list[12] + build_icons() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon_ch.dm deleted file mode 100644 index d762c2170a..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon_ch.dm +++ /dev/null @@ -1,1064 +0,0 @@ -/* -HARK, YON CODE DIVER. -What lays before you is a lot of spaghetti in order to make a fairly unique boss mob. -Scour its code if you dare. - -Here's a summary, however. - -This is a 128x64px mob with sprites drawn by Przyjaciel (thanks mate) and some codersprites. - -The bigdragon is an 800 health hostile boss mob with three special attacks. -The first (disarm intent) is a charge attack that activates when the target is >5 tiles away and requires line of sight. -While charging, the dragon can run up/down cliffs harmlessly, but will thunk into objects for a brief stun. -Charging requires direct line of sight to start the attack. -Charging directly onto someone deals 50 brute and stuns them, likely with vore to follow. -Charging next to someone will deal 20 brute and send them flying. - -The second (grab intent) is a tail sweep attack that activates when 2 or more hostiles are within 2 tiles of it. -The tail sweep deals 20 brute to all targets and throws them back a great distance with a brief stun. -Tail sweeping while ontop of a target will deal 50 brute like the charge above. - -The third (harm intent) is a telegraphed flame swathe attack. The inidividual flame pellets deal 30 burn each and set mobs and carbons on fire alike. -This attack is the mobs default attack. - -When the big dragon is below 1/2 health, or was previously friendly and was pissed off, it will enrage. -While enraged, the dragon will NOT stop and stand still while telegraphing its attacks. -This is exceptionally dangerous, as it will actively breathe fire whilest pursuing a target. - -DO NOT challenge this beast in open fields. You need cover to survive. -Unless you're a tesh or something I guess. Speed. - -As a flex, this mob has six vore organs. -It will swap between two variants (heal and digest) depending on if it's friendly or not. -It will eat prey with its maw, which has code in place to automatically push prey deeper over time. -The mob will only get increased "fullness" for prey who have made it to its stomach. Y'know. So the fat sprites make sense. - -This mob can be made friendly by supplying it with a gold coin or a gold ingot. I'd make it every gold item, but then you could just raid its hoard for an easy tame. And that's lame. - -While friendly, it will actively search for players with <95% health and attempt to vore them into its heal bellies. -On success, the targets are also injected with some helpful chemicals. Just to make sure they don't.. y'know, die while being swallowed. - -The mobs icons are modular and interchangeable, there's even a neat verb in the abilities tab when player controlled to pick and choose what you want. -Otherwise, when naturally spawned, their icons are picked from a curated list. - -I think I covered everything. -*/ - -/// -/// Main type -/// - -/mob/living/simple_mob/vore/bigdragon - name = "large dragon" - desc = "A large, intimidating creature reminiscent of the traditional idea of medieval fire breathing lizards." - catalogue_data = list(/datum/category_item/catalogue/fauna/bigdragon) - tt_desc = "S Draco Ignis" - icon = 'icons/mob/vore128x64_ch.dmi' - icon_state = "dragon_maneNone" //Invisible, necessary for examine stuff - icon_rest = "dragon_maneNone" - icon_living = "dragon_maneNone" - player_msg = "You can perform a charge attack by disarm intent clicking somewhere. Grab intent clicking will perform a tail sweep and fling any nearby mobs. You can fire breath with harm intent. Your attacks have cooldowns associated with them. You can heal slowly by resting. Check your abilities tab for other functions!" - meat_amount = 40 - meat_type = /obj/item/reagent_containers/food/snacks/meat - old_x = -48 - old_y = 0 - melee_damage_lower = 35 - melee_damage_upper = 25 - melee_miss_chance = 0 - melee_attack_delay = 0 - friendly = list("nudges", "sniffs on", "rumbles softly at", "slobberlicks") - response_help = "pats" - response_disarm = "shoves" - response_harm = "smacks" - movement_cooldown = 2 - maxHealth = 800 - attacktext = list("slashed") - see_in_dark = 8 - minbodytemp = 0 - maxbodytemp = 99999 - min_oxy = 0 - heat_resist = 1 - ai_holder_type = /datum/ai_holder/simple_mob/intentional/dragon - max_buckled_mobs = 1 - mount_offset_y = 32 - mount_offset_x = -16 - can_buckle = 1 - buckle_movable = 1 - buckle_lying = 0 - vore_bump_chance = 50 - vore_pounce_chance = 100 - vore_active = 1 - vore_icons = 2 - vore_capacity = 2 - vore_pounce_maxhealth = 125 - vore_bump_emote = "tries to snap up" - icon_dead = "dragon-dead" - faction = FACTION_DRAGON - glow_range = 7 - glow_intensity = 3 - glow_color = "#ED9200" - say_list_type = /datum/say_list/bigdragon - devourable = 0 //No - universal_understand = 1 //So they can hear synth speach - - special_attack_min_range = 1 - special_attack_max_range = 10 - special_attack_cooldown = 80 - - plane = ABOVE_MOB_PLANE - - //Dragon vars - var/notame - var/norange - var/nospecial - var/noenrage - var/enraged - var/flametoggle = 1 - var/specialtoggle = 1 - var/gut1 - var/gut2 - var/small = 0 - var/small_icon = 'icons/mob/bigdragon_small_ch.dmi' - var/small_icon_state = "dragon_small" - //var/nameset //Implemented upstream - var/flames - - tame_items = list( - /obj/item/coin/gold = 100, - /obj/item/stack/material/gold = 100 - ) - - //recycling spider lunge with some modifications - var/charge_warmup = 2 SECOND - var/charge_sound = 'sound/weapons/spiderlunge.ogg' - - //Modular icons. Lists are referred to when picking styles. - - //Sprites are layered ontop of one-another in order of this list - var/list/overlay_colors = list( - "Underbelly" = "#FFFFFF", - "Body" = "#FFFFFF", - "Ears" = "#FFFFFF", - "Mane" = "#FFFFFF", - "Horns" = "#FFFFFF", - "Eyes" = "#FFFFFF" - ) - //If you add any more, it's as easy as adding the icons to these lists - var/list/underbelly_styles = list( - "Smooth", - "Plated" - ) - var/under - var/list/body_styles = list( - "Smooth", - "Scaled" - ) - var/body - var/list/ear_styles = list( - "Normal" - ) - var/ears - var/list/mane_styles = list( - "None", - "Shaggy", - "Dorsalfin" - ) - var/mane - var/list/horn_styles = list( - "Pointy", - "Curved", - "Curved2", - "Jagged", - "Crown", - "Skull" - ) - var/horns - var/list/eye_styles = list( - "Normal" - ) - var/eyes - - can_be_drop_prey = FALSE - -/// -/// Subtypes -/// - -/mob/living/simple_mob/vore/bigdragon/friendly - ai_holder_type = /datum/ai_holder/simple_mob/healbelly/retaliate/dragon - desc = "A large, intimidating creature reminiscent of the traditional idea of medieval fire breathing lizards. This one seems particularly relaxed and jovial." - faction = FACTION_NEUTRAL - player_msg = "You're a variant of the large dragon stripped of its firebreath attack (harm intent). You can still charge (disarm) and tail sweep (grab). Rest to heal slowly. Check your abilities tab for functions." - norange = 1 - noenrage = 1 - -// Weakened variant for maintpreds -/mob/living/simple_mob/vore/bigdragon/friendly/maintpred - name = "lesser dragon" - desc = "A large, intimidating creature reminiscent of the traditional idea of medieval fire breathing lizards. This one seems weaker than the rest." - player_msg = "You're a nerfed variant of the large dragon with reduced health, reduced melee damage and your special attacks disabled. Resting will heal you slowly over time. Check abilities tab for functions." - nospecial = 1 - maxHealth = 200 - melee_damage_lower = 20 - melee_damage_upper = 15 - allow_mind_transfer = TRUE - -/// -/// Misc define stuff -/// - -/datum/say_list/bigdragon - speak = list("Rhf.", "Hrff.", "Grph.", "Rhrrr.") - emote_hear = list("chuffs", "rawrs", "wehs", "roars", "scoffs", "yawns") - emote_see = list("licks their chops", "stretches", "yawns", "snarls") - say_maybe_target = list("Hrmph?") - say_got_target = list("FOOL.", "+INSOLENT+.", "YOU'VE MADE A MISTAKE TODAY.") - -/datum/category_item/catalogue/fauna/bigdragon - name = "Invasive Fauna - Large Dragon" - desc = "Classification: S Draco Ignis\ -

\ - Dragons have long since been a familiar species across the frontier,\ - with origins tracing them all the way back to originating somewhere within the Sol system.\ - While they are in no way an uncommon species in modern times, their innate nomadic and often times hermited tendancies make discovery of \ - all their evolutionary forks troubling.\ -
\ - Some have long since evolved to intergrate well within our definitions of society as a whole, while others, such as this one, have maintained a \ - far more \"traditonal\" way of life, in line with ancient history dictating them to be long lifed hermits with great hoardes of wealth. \ - This is not to say that all variants prefer this lifestyle, of course. \ -
\ - These dragons, unlike their cousins, have evolved to remain quadrupedal in likeness of their origins. Though some have evolved the necessary opposable grip \ - necessary for tool manipulation.\ -
\ - If uptaking a threatening, imposing stance, it is rumoured that these Dragons can be woo'd or otherwise distracted by offering them an item that could be added to their hoard.\ - The most common example of this being gold coins and ingots." - value = CATALOGUER_REWARD_SUPERHARD //Scan range is the same as flame breath range. Good luck. - -/mob/living/simple_mob/vore/bigdragon/Login() - . = ..() - if(!riding_datum) - riding_datum = new /datum/riding/simple_mob(src) - add_verb(src,/mob/living/simple_mob/proc/animal_mount) - add_verb(src,/mob/living/proc/toggle_rider_reins) - add_verb(src,/mob/living/simple_mob/vore/bigdragon/proc/set_style) - add_verb(src,/mob/living/simple_mob/vore/bigdragon/proc/toggle_glow) - add_verb(src,/mob/living/simple_mob/vore/bigdragon/proc/sprite_toggle) - add_verb(src,/mob/living/simple_mob/vore/bigdragon/proc/flame_toggle) - add_verb(src,/mob/living/simple_mob/vore/bigdragon/proc/special_toggle) - //verbs |= /mob/living/simple_mob/vore/bigdragon/proc/set_name //Implemented upstream - //verbs |= /mob/living/simple_mob/vore/bigdragon/proc/set_desc //Implemented upstream - faction = FACTION_NEUTRAL - -/mob/living/simple_mob/vore/bigdragon/Initialize(mapload) - . = ..() - src.adjust_nutrition(src.max_nutrition) - build_icons(1) - voremob_loaded = 1 - add_language(LANGUAGE_DRUDAKAR) - add_language(LANGUAGE_UNATHI) - mob_radio = new /obj/item/radio/headset/mob_headset(src) //We always give radios to spawned mobs anyway - -/mob/living/simple_mob/vore/bigdragon/MouseDrop_T(mob/living/M, mob/living/user) - return - -/mob/living/simple_mob/vore/bigdragon/runechat_y_offset(width, height) - return (..()*size_multiplier) + 40 - -/// -/// Verbs -/// - -/mob/living/simple_mob/vore/bigdragon/proc/toggle_glow() - set name = "Toggle Glow" - set desc = "Switch between glowing and not glowing." - set category = "Abilities.Settings" - - glow_toggle = !glow_toggle - -/mob/living/simple_mob/vore/bigdragon/proc/sprite_toggle() - set name = "Toggle Small Sprite" - set desc = "Switches your sprite to a smaller variant so you can see what you're doing. Others will always see your standard sprite instead. " - set category = "Abilities.Settings" - - if(!small) - var/image/I = image(icon = small_icon, icon_state = small_icon_state, loc = src) - I.override = TRUE - var/list/L = list(src) - src.add_alt_appearance("smallsprite", I, displayTo = L) - small = TRUE - else - src.remove_alt_appearance("smallsprite") - small = FALSE - -/mob/living/simple_mob/vore/bigdragon/proc/flame_toggle() - set name = "Toggle breath attack" - set desc = "Toggles whether you will breath attack on harm intent (If you have one)." - set category = "Abilities.Settings" - - if(norange) - to_chat(src, span_userdanger("You don't have a breath attack!")) - return - - flametoggle = !flametoggle - to_chat(src, span_notice("You will [flametoggle?"now breath":"no longer breath"] attack on harm intent.")) - -/mob/living/simple_mob/vore/bigdragon/proc/special_toggle() - set name = "Toggle special attacks" - set desc = "Toggles whether you will tail spin and charge (If you have them)." - set category = "Abilities.Settings" - - if(nospecial) - to_chat(src, span_userdanger("You don't have special attacks!")) - return - - specialtoggle = !specialtoggle - to_chat(src, span_notice("You will [specialtoggle?"now special":"no longer special"] attack on grab/disarm intent.")) - -/* //Implemented upstream -/mob/living/simple_mob/vore/bigdragon/proc/set_name() - set name = "Set Name" - set desc = "Sets your mobs name. You only get to do this once." - set category = "Abilities.Settings" - if(nameset) - to_chat(src, span_userdanger("You've already set your name. Ask an admin to toggle \"nameset\" to 0 if you really must.")) - return - var/newname - newname = sanitizeSafe(tgui_input_text(src,"Set your name. You only get to do this once. Max 52 chars.", "Name set","", MAX_NAME_LEN), MAX_NAME_LEN) - if (newname) - name = newname - voice_name = newname - nameset = 1 - -/mob/living/simple_mob/vore/bigdragon/proc/set_desc() - set name = "Set Description" - set desc = "Set your description." - set category = "Abilities.Settings" - var/newdesc - newdesc = sanitizeSafe(tgui_input_text(src,"Set your description. Max 4096 chars.", "Description set","")) - if(newdesc) - desc = newdesc -*/ - -/// -/// Icon generation stuff -/// - -/mob/living/simple_mob/vore/bigdragon/update_icon() - ..() - update_fullness() - build_icons() - -/* /mob/living/simple_mob/vore/bigdragon/update_fullness() - var/new_fullness = 0 - // Only count stomachs to fullness - for(var/obj/belly/B in vore_organs) - if(B.name == "Stomach" || B.name == "Second Stomach") - for(var/mob/living/M in B) - new_fullness += M.size_multiplier - new_fullness /= size_multiplier - new_fullness = round(new_fullness, 1) - vore_fullness = min(vore_capacity, new_fullness) - */ - -/mob/living/simple_mob/vore/bigdragon/proc/build_icons(var/random) - cut_overlays() - if(stat == DEAD) - plane = MOB_LAYER - return - else - plane = ABOVE_MOB_PLANE - if(random) - var/list/bodycolors = list("#1E1E1E","#3F3F3F","#545454","#969696","#DBDBDB","#ABBBD8","#3D0B00","#3A221D","#77554F","#281D1B","#631F00","#964421","#936B24","#381313","#380000","#682121","#700E00","#44525B","#283035","#29353D","#353E44","#281000","#38261A","#302F3D","#322E3A","#262738") - under = pick(underbelly_styles) - overlay_colors["Underbelly"] = pick(bodycolors) - body = pick(body_styles) - overlay_colors["Body"] = pick(bodycolors) - ears = pick(ear_styles) - overlay_colors["Ears"] = get_random_colour(0, 100, 150) - mane = pick(mane_styles) - overlay_colors["Mane"] = pick(bodycolors) - horns = pick(horn_styles) - var/list/horncolors = list("#000000","#151515","#303030","#606060","#808080","#AAAAAA","#CCCCCC","#EEEEEE","#FFFFFF") - overlay_colors["Horns"] = pick(horncolors) - eyes = pick(eye_styles) - overlay_colors["Eyes"] = get_random_colour(1) - - var/image/I = image(icon, "dragon_under[under][resting? "-rest" : (vore_fullness? "-[vore_fullness]" : null)]", pixel_x = -48) - I.color = overlay_colors["Underbelly"] - I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) - I.plane = MOB_PLANE - I.layer = MOB_LAYER - add_overlay(I) - - I = image(icon, "dragon_body[body][resting? "-rest" : null]", pixel_x = -48) - I.color = overlay_colors["Body"] - I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) - I.plane = MOB_PLANE - I.layer = MOB_LAYER - add_overlay(I) - - I = image(icon, "dragon_ears[ears][resting? "-rest" : null]", pixel_x = -48) - I.color = overlay_colors["Ears"] - I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) - I.plane = MOB_PLANE - I.layer = MOB_LAYER - add_overlay(I) - - I = image(icon, "dragon_mane[mane][resting? "-rest" : null]", pixel_x = -48) - I.color = overlay_colors["Mane"] - I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) - I.plane = MOB_PLANE - I.layer = MOB_LAYER - add_overlay(I) - - I = image(icon, "dragon_horns[horns][resting? "-rest" : null]", pixel_x = -48) - I.color = overlay_colors["Horns"] - I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) - I.plane = MOB_PLANE - I.layer = MOB_LAYER - add_overlay(I) - - I = image(icon, "dragon_eyes[eyes][resting? "-rest" : null]", pixel_x = -48) - I.color = overlay_colors["Eyes"] - I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) - I.plane = PLANE_LIGHTING_ABOVE - add_overlay(I) - - if(enraged) - I = image(icon, "dragon_rage", pixel_x = -48) - I.appearance_flags |= PIXEL_SCALE - I.plane = MOB_PLANE - I.layer = MOB_LAYER - add_overlay(I) - if(flames) - I = image(icon, "dragon_flame[resting? "-rest" : null]", pixel_x = -48) - I.appearance_flags |= PIXEL_SCALE - I.plane = PLANE_LIGHTING_ABOVE - add_overlay(I) - -/mob/living/simple_mob/vore/bigdragon/proc/set_style() - set name = "Set Dragon Style" - set desc = "Customise your icons." - set category = "Abilities.Settings" - - var/list/options = list("Underbelly","Body","Ears","Mane","Horns","Eyes") - for(var/option in options) - LAZYSET(options, option, new /image('icons/effects/bigdragon_labels_ch.dmi', option)) - var/choice = show_radial_menu(src, src, options, radius = 60) - if(!choice || QDELETED(src) || src.incapacitated()) - return FALSE - . = TRUE - switch(choice) - if("Underbelly") - options = underbelly_styles - for(var/option in options) - var/image/I = new /image('icons/mob/vore128x64_ch.dmi', "dragon_under[option]", dir = 4, pixel_x = -48) - LAZYSET(options, option, I) - choice = show_radial_menu(src, src, options, radius = 90) - if(!choice || QDELETED(src) || src.incapacitated()) - return 0 - var/new_color = tgui_color_picker(src, "Pick underbelly color:","Underbelly Color", overlay_colors["Underbelly"]) - if(!new_color) - return 0 - under = choice - overlay_colors["Underbelly"] = new_color - if("Body") - options = body_styles - for(var/option in options) - var/image/I = new /image('icons/mob/vore128x64_ch.dmi', "dragon_body[option]", dir = 4, pixel_x = -48) - LAZYSET(options, option, I) - choice = show_radial_menu(src, src, options, radius = 90) - if(!choice || QDELETED(src) || src.incapacitated()) - return 0 - var/new_color = tgui_color_picker(src, "Pick body color:","Body Color", overlay_colors["Body"]) - if(!new_color) - return 0 - body = choice - overlay_colors["Body"] = new_color - if("Ears") - options = ear_styles - for(var/option in options) - var/image/I = new /image('icons/mob/vore128x64_ch.dmi', "dragon_ears[option]", dir = 4, pixel_x = -76, pixel_y = -50) - LAZYSET(options, option, I) - choice = show_radial_menu(src, src, options, radius = 90) - if(!choice || QDELETED(src) || src.incapacitated()) - return 0 - var/new_color = tgui_color_picker(src, "Pick ear color:","Ear Color", overlay_colors["Ears"]) - if(!new_color) - return 0 - ears = choice - overlay_colors["Ears"] = new_color - if("Mane") - options = mane_styles - for(var/option in options) - var/image/I = new /image('icons/mob/vore128x64_ch.dmi', "dragon_mane[option]", dir = 4, pixel_x = -76, pixel_y = -50) - LAZYSET(options, option, I) - choice = show_radial_menu(src, src, options, radius = 90) - if(!choice || QDELETED(src) || src.incapacitated()) - return 0 - var/new_color = tgui_color_picker(src, "Pick mane color:","Mane Color", overlay_colors["Mane"]) - if(!new_color) - return 0 - mane = choice - overlay_colors["Mane"] = new_color - if("Horns") - options = horn_styles - for(var/option in options) - var/image/I = new /image('icons/mob/vore128x64_ch.dmi', "dragon_horns[option]", dir = 4, pixel_x = -86, pixel_y = -50) - LAZYSET(options, option, I) - choice = show_radial_menu(src, src, options, radius = 90) - if(!choice || QDELETED(src) || src.incapacitated()) - return 0 - var/new_color = tgui_color_picker(src, "Pick horn color:","Horn Color", overlay_colors["Horns"]) - if(!new_color) - return 0 - horns = choice - overlay_colors["Horns"] = new_color - if("Eyes") - options = eye_styles - for(var/option in options) - var/image/I = new /image('icons/mob/vore128x64_ch.dmi', "dragon_eyes[option]", dir = 2, pixel_x = -48, pixel_y = -50) - LAZYSET(options, option, I) - choice = show_radial_menu(src, src, options, radius = 90) - if(!choice || QDELETED(src) || src.incapacitated()) - return 0 - var/new_color = tgui_color_picker(src, "Pick eye color:","Eye Color", overlay_colors["Eyes"]) - if(!new_color) - return 0 - eyes = choice - overlay_colors["Eyes"] = new_color - if(.) - build_icons() - -/// -/// Vore stuff -/// -/// My thanks to Raeschen for these descriptions - -/mob/living/simple_mob/vore/bigdragon/load_default_bellies() - var/obj/belly/B = new /obj/belly/dragon/maw(src) - B.affects_vore_sprites = FALSE - B.emote_lists[DM_HOLD] = list( - "The dragon's breath continues to pant over you rhythmically, each exhale carrying a bone-shivering growl", - "The thick, heavy tongue lifts, curling around you, cramming you tightly against it's teeth, to squeeze some flavor out of you.", - "For a moment, you find yourself slipping underneath the tongue, into the plush silky space beneath. After a momentary squirm, the tongue scoops you back atop itself, twice as slimy as before.", - "The vast tongue quivers, inching you up close to it's gaping gullet. The slick hatch squeezes on a limb of yours, giving it a plush, sloppy, inviting tug...", - "Nestled atop the muscle, an array of deep, dull muffled glrrrgles echo up the beast's gullet, a gastric siren-song calling out for you.") - gut1 = B - vore_selected = B - B = new /obj/belly/dragon/throat(src) - B.affects_vore_sprites = FALSE - B.emote_lists[DM_HOLD] = list( - "Gggllrrrk! Another loud, squelching swallow rings out in your ears, dragging you a little deeper into the furnace-like humid heat of the dragon's body.", - "Nestling in a still throat for a moment, you feel the walls quiver and undulate excitedly in tune with the beast's heartbeat.", - "A particularly lengthy moment between swallows passes. Perhaps the beast has calmed? Perhaps you might be able to squir-Gggglllk. Squelch. Deeper into the abyss you slide. No escape, probably.", - "The throat closes in tightly, utterly cocooning you with it's silken spongey embrace. Like this it holds, until you feel like you might pass out... eventually, it would shlllrrk agape and loosen up all around you once more, the beast not wanting to lose the wriggly sensation of live prey.", - "Blrrbles and squelching pops from it's stomach echo out below you. Each swallow brings greater clarity to those digestive sounds, and stronger acidity to the muggy air around you, inching you closer to it's grasp. Not long now.") - B = new /obj/belly/dragon/stomach(src) - B.emote_lists[DM_DIGEST] = list( - "The stomach walls spontaneously contract! Those wavey, fleshy walls binding your body in their embrace for the moment, slathering you with thick, caustic acids.", - "You hear a soft rumbling as the dragon’s insides churn around your body, the well-used stomach walls shuddering with a growl as you melt down.", - "The stomach squishes and squelches over your body, the growling and grumbling of those bowels kneading you into submission like a deafening orchestra. Gradually melting you down into something easier to manage", - "As your body breaks down into this beasts lunch you feel the walls compress tighter and tighter every moment pressing a crushing weight on your form.", - "The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!", - "The drake happily wanders around while digesting its meal, almost like it is trying to show off the hanging gut you've given it.") - B = new /obj/belly/dragon/maw/heal(src) - B.affects_vore_sprites = FALSE - B.emote_lists[DM_HEAL] = list( - "Gently, the dragon's hot, bumpy tongue cradles you, feeling like a slime-soaked memory-foam bed, twitching with life. The delicacy that the dragon holds you with is quite soothing.", - "The wide, slick throat infront of you constantly quivers and undulates. Every hot muggy exhale of the beast makes that throat spread, ropes of slime within it's hold shivering in the flow, inhales causing it to clench up somewhat.", - "That mighty tongue of the dragon's curls itself into a halfpipe shape, cradling you snugly in it. The sides of the muscle hug your own flanks, forming a bed moulded to your contours. It keeps you well clear of those teeth, carrying you gently up against the ridges of it's palate, right before it's throat.", - "Rhythmically, the tongue nudges you closer and closer to it's slack slimy gullet. It leaves little gaps in the motions, seemingly chances for you to understand it's intentions and escape if you so wish. Remaining calm would result in slithering yet closer...", - "Saliva soaks the area all around you thickly, lubricating absolutely everything with the hot liquid. From time to time, the beast carefully shifts the rear of it's tongue to piston a cache of the goop down the hatch. The throat seen clenching tightly shut, the tongue's rear bobbing upwards, before down again - showing off a freshly slime-soaked entrance.") - gut2 = B - B = new /obj/belly/dragon/throat/heal(src) - B.affects_vore_sprites = FALSE - B.emote_lists[DM_HEAL] = list( - "The tunnel of the gullet closely wraps around you, mummifying you in a hot writhing embrace of silky flesh. The walls are slick, soaked in a lubricating slime, and so very warm.", - "The walls around you pulse in time with the dragon's heartbeat, which itself pounds in your ears. Rushing wind of calm breaths fill the gaps, and distant squelches of slimy payloads shifted around by soft flesh echo down below.", - "A tight squeeze of muscle surrounds you as another glllrk rings out, squelching the slimy mass that is yourself a little deeper into it's bulk. The soothing warmth increases the deeper you slide.", - "Soothing thrumms from the beast sound out, to try help calm you on your way down. The dragon seems to not want you to panic, using surprisingly gentle intent.", - "Clenchy embraces rhythmically squelch over you. Spreading outwards, the walls would relent, letting you spread a hot, gooey pocket of space around yourself. You linger, before another undulation of a swallow nudges you further down.") - B = new /obj/belly/dragon/stomach/heal(src) - B.emote_lists[DM_HEAL] = list( - "In tune with the beast's heartbeat, the walls heave and spread all around you. In, tight and close, and then outwards, spreading cobwebs of slime all around.", - "The thick folds of flesh around you blrrrble and sqllrrch, as the flesh itself secretes more of this strange, pure, goopy liquid, clenching it among it's crevices to squeeze it all over you in a mess.", - "Smooth, happy rumbles echo all around, the dragon seemingly deriving pleasure from the weight and motions you make within it's depths. The walls roll and churn endlessly, happy to hold on to you as long as you wish to stay.", - "A soft swaying, like the waves of an ocean, squish you to one side, and then to the other. The dragon's gentle movements seem to sway you side to side, as if in a tight possessive hammock on it's underside.", - "Nearby, a louder cacophany of gushing glrrrbles, deep dull squelches, and even deeper glrrns call out. This safe pocket of flesh seems to be up close and intimate with the dragon's normal, larger stomach, thus you rest safely spectating the sounds it makes.", - "The rushing breathing of the beast continues at a slow pace, indicating the calm it has. Holding you like this seems quite enjoyable to them, the chamber's folds just as calm and lazy in their motions of squelching the slimy contents all over your form.") - -//Making unique belly subtypes for cleanliness and my sanity -/obj/belly/dragon - autotransferchance = 50 - autotransferwait = 150 - escapable = 1 - escapechance = 100 - escapetime = 30 - fancy_vore = 1 - contamination_color = "grey" - contamination_flavor = "Wet" - vore_verb = "slurp" - belly_fullscreen_color = "#711e1e" - -/obj/belly/dragon/maw - name = "Maw" - desc = "Seizing it's opportunity, the dragon's jaws swoop in to scoop you up off of your feet, giving you a view down your body of the glistening, red interior. Vicious looking jaws hover above you like a guillotine, threatening to sink down into you, though such a thing never arrives. Seems it has a slower fate in store for you, as it guides your body along the bumpy mattress of it's tongue until the lowermost parts of your body press around the entrance of it's wide, quivering throat. The jaws snap shut, trapping you within, though thankfully clear of snagging your body between them. It's vast tongue coming to life, lifting to cram you against the insides of it's teeth and against the cathedral-roof ridges of it's palate - lathering you in hot, oily drool. It's panting, growled breaths gust from that wide, eye-catching hatch at the back, blasting you with murky breath and airborne spittle, presenting itself as a place to get up close and intimate with very, very soon...." - escapechance = 100 - struggle_messages_inside = list( - "You wriggle and wrestle for purchase against the tongue. It lifts, cocooning and squeezing you hard between itself and the palate.", - "Reaching out, you try to pry at the beast's interlocked, mighty teeth. A zig-zag crack of light bleeds in to the maw for a moment, presenting you with your current, slimy state, before clicking shut once more.", - "You try to wriggle to the very front of the jaws to keep safe from that abyssal gullet. It works for a while, before the tongue scoops you right up close to that slick hatch, presenting you with a view of those dark, undulating, sloppy depths.", - "You brace your back against the spongey mattress of the tongue, and plant your limbs up against the roof. Straining hard, you try to force the jaws agape. A dull growl increases, blasting you in humid murk and drool the more you strain, your efforts ultimately useless.", - "Struggling for escape, you find yourself able to slip an arm between the beast's teeth and lips, reaching into the colder outside air. It doesn't take long for the beast's tongue to slither out with it, wrap over the limb, tugging it back inside with a noisy slllrrrp of it's lips.") - autotransferlocation = "Throat" - belly_fullscreen = "a_tumby" - vore_sound = "Insertion1" - -/obj/belly/dragon/maw/heal - name = "Maw." - desc = "With a surprisingly gentle touch, the dragon's jaws descend over your form, gingerly carrying you up high after seeking a hold on your body. The tongue blankets you intimately to keep you safe from it's toothy, vicious jaws, slithering down your torso, hooking up between legs to take your weight. It's head lifts high on up, tilting level, leaving you sprawled flat on your front atop the thick bumpy mattress of it's tongue - that muscle looming outwards, slathering over the beast's scaly lips, snagging your exterior parts to bring you entirely inside. It's hot, humid, and pretty murky - the maw of such a dangerous beast providing quite a hostile environment - though it's delicacy leads you to wonder how much danger you are really in. Urgent pat-pats of it's tongue against your rear usher you closer to it's throat, as the beast makes a soft, concerned rumble at you, trying to get you to slide down. It's gentle touch leaves you aware of just how easy it would be to wriggle free and escape." - digest_mode = DM_HEAL - mode_flags = DM_FLAG_NUMBING - struggle_messages_inside = list( - "Wriggling around and resisting the beast's efforts to gently devour you, makes them call out to you with a deeply concerned rhhhrrrl. It sounds like it's trying to reassure you, though it seems to relent and let you pry the jaws agape to attempt to slide yourself free.") - autotransferlocation = "Throat." - human_prey_swallow_time = 40 //Probably should eat people quick if they're dying - -/obj/belly/dragon/throat - name = "Throat" - transferchance = 20 - transferlocation = "Maw" - escapechance = 0 - desc = "...And that 'very, very soon' rapidly becomes 'now'. The mighty tongue lifts, having collected enough of your flavor, squelching your lower body up to your chest inside it's hot gullet, giving you an ample view of itself slithering up over your body. You get to watch it quiver and clench with a resounding glllk, around you, the tongue's fat bumpy rear lifting behind your head to displace you down and inside the clinging tunnel. Tight, crushing pressure embraces you with each of those deep, liquid-sounding swallows, inching you down little by little each time. The flesh of the tunnel wraps you tightly, leaving you mostly unable to move, given short moments of respite between each swallow, to listen to the thudding heartbeat and the distant glrrrbles deep below. The hot scent of acidity grows stronger, the deeper you plunge..." - struggle_messages_inside = list( - "With as much effort as you can muster, you squirm and writhe, trying to swim up the passage of soft flesh. You barely peek out the beast's gullet, before the back of it's tongue squelches into your face, forcing you back down.", - "You struggle and press outwards firmly against the walls. The beast rumbles out over you, shaking you to your bones. Was that a sound of pleasure from the dragon? Perhaps more of this struggling might appease it...", - "Bracing your back against a wall, you try to press outwards with all the strength you have, to spread the throat agape. For a moment, it affords you a nice view down your body, towards the sealed muscular entryway to it's stomach. Everything clenches back shut around you shortly after.", - "More squirming and struggling outwards, trying to hold the throat's muscular walls at bay. Every time you press outwards, the walls press back with twice the strength. Much more of this and it might threaten to crush. Perhaps you should just give in...", - "You frantically writhe upwards a couple of inches, before the beast swallows with a sloppy-sounding glllggk, sending you back down a foot or so. Each struggle you make only seems to hasten your journey down the hatch. ") - autotransferlocation = "Stomach" - belly_fullscreen = "another_tumby" - vore_sound = "Tauric Swallow" - - -/obj/belly/dragon/throat/heal - name = "Throat." - desc = "Giving in to the beast's gentle ministrations, you let yourself get slowly urged forward by the fat tongue, squelched cheek-first against the hot, wet back of it's throat, the gullet guiding you down and inside. Schllorp! You descend into the jelly-like folds of the dragon's quivering gullet, rhythmic periastaltic motions helping to suckle and drag you inside. the last of your body slides off of it's tongue, the rear of that muscle lifting up against the last of you to help squelch you down. Each swallow leaves a little time inbetween, and the pace down the hatch is slow and gentle - you feel like resistance and squirms would defeat this pace and have you slithering back up the way you came." - escapechance = 0 - transferchance = 100 - transferlocation = "Maw." - digest_mode = DM_HEAL - mode_flags = DM_FLAG_NUMBING - struggle_messages_inside = list( - "Writhing firmly inside the tunnel, you try to 'swim' back up the way you came. The swallows relent, and the beast croons softly at you - the walls of the throat tensing to allow for better grip. Slowly but surely, you start wriggling back up towards the dragon's jaws, the beast seeming to permit the action.") - autotransferlocation = "Second Stomach" - -/obj/belly/dragon/stomach - name = "Stomach" - escapechance = 0 - transferchance = 10 - transferlocation = "Throat" - desc = "The final part of your journey arrives, in the form of a tightly squelched, muscular sphincter. Throat pressure crams against you, until abruptly, you find yourself spat into a hot, caustic cauldron of churning doom, the dragon's stomach. After slithering in, the way you entered squelches shut, dissapearing among the folds - impossible for you to find any more. You are trapped, no way out, lounging in a shallow pool of thick sticky juices. endless undulations from thick, pendulous folds of stomach-wall all around continually churn it up into a foamy, bubbling mess, soaking their folds in it to drip in ropes and even shivering sheets of the stuff around you. Clenches gush the digestive slimes all over you from time to time, cradling you in it's noxious embrace. Your ears are filled with such sloppy squelches now, those distant muffled glrrns you heard earlier now sharp, crisp, and thunderous as you nestle in their very source. Settle down for what little time you have left, for your fate rests adding to the powerful beast all around you." - digest_mode = DM_DIGEST - digest_brute = 0 - digest_burn = 2 - struggle_messages_inside = list( - "Eager to try and escape before you lack the strength to do so anymore, you pound firmly against those walls. They clench in twice as hard, the beast letting out a pleased rumble. Seems it wants you to do that again!", - "You try to stand inside the clinging gut, to force your arms and head upwards towards the way you came in. Searching through each and every fold for the muscled entryway leaves you discovering nothing but caches of goop, soaking over you all the more.", - "You press all your limbs out firmly into the walls to try and struggle. The softness of the flesh simply envelops over each of them, giving them a close kneading snuggle in hot oily goop.", - "Each squirm and struggle you try to make just makes the beast rumble deeply in pleasure. It wriggles itself, sloshing and shaking you about, to try goad you into struggling all the more.", - "Yet more frantic wriggling and squirming from you, pressing and thumping out into walls which themselves greedily devour all the effort you make into them. this deep inside, it doesn't appear to be helping.") - belly_fullscreen = "da_tumby" - vore_sound = "Stomach Move" - -/obj/belly/dragon/stomach/heal - name = "Second Stomach" - desc = "You've kept yourself surrendered and let the beast get you this far, and now you find yourself squelching into the puffy, pillowy clutches of a rather tight chamber, spat slowly inside from the last portion of the gullet. It's pretty cramped in here, though the sheer squishiness of the walls allows you to stretch yourself out into them. Nothing but doughy texture for inches, even feet, deep into the walls. The chamber secretes a thick, clear slime all over you, the walls churning and lathering every single part of you lovingly in it's embrace. Its incessant, kneading affections seems reminiscent of the digestive processes, yet you feel no tingle from the liquid. To the contrary, any injuries or cuts you have, seem to buzz and heat up on touch with the liquids, closing up and healing over at a visibly rapid pace. This hidden space inside the beast seems to be dedicated to holding and healing things within it! The air, although humid and murky, is very breathable in here, though nearby - very close to you, is the constant squelch and churn of the standard processes of the dragon's digestive system. Seems you are right next door to a place you could of gone to! The path you entered remains visible among the undulating squelch of padded walls, and you feel that it wouldn't be too hard to writhe yourself back up into it's snug embrace." - escapechance = 0 - transferchance = 100 - transferlocation = "Throat." - digest_mode = DM_HEAL - mode_flags = DM_FLAG_NUMBING - struggle_messages_inside = list( - "Deciding that you've stayed long enough, you wriggle and writhe, stretching yourself out in the chamber, trying to thrust your hands and face up the way you entered. The beast stirs, and this churny pocket of flesh providing you safety clenches hard, aiding your entry back up into the lowermost depths of it's gullet. rhythmic clenches continue to invite you back down, however, should you reconsider.") - belly_fullscreen = "anim_belly" - -/// -/// AI handling stuff -/// - -/datum/ai_holder/simple_mob/intentional/dragon - intelligence_level = 3 - mauling = 1 - var/yeet_range = 2 - var/yeet_threshold = 2 - var/charge_max = 5 - -/mob/living/simple_mob/vore/bigdragon/handle_special() - if(!noenrage) - if(!enraged) - if(health <= (maxHealth * 0.5)) - enraged = 1 - say("No more games. COME HERE.") - if(enraged) - if(health >= (maxHealth * 0.5)) - enraged = 0 - if(resting) //Give them a way to slowly heal over time while player controlled - adjustBruteLoss(-2.5) - adjustFireLoss(-2.5) - adjustToxLoss(-5) - adjustOxyLoss(-5) - -/datum/ai_holder/simple_mob/intentional/dragon/pre_special_attack(atom/A) - if(isliving(A)) - var/mob/living/target = A - var/tally = 0 - var/list/potential_targets = list_targets() - //Spin attack if surrounded - for(var/atom/movable/AM in potential_targets) - if(get_dist(holder, AM) > yeet_range) - continue - if(!can_attack(AM)) - continue - tally++ - if(tally >= yeet_threshold) - holder.a_intent = I_GRAB - return - - //Charge attack if target is far away, but not if there's no line of sight - if(get_dist(holder, target) > charge_max) - if(target in check_trajectory(target, holder, pass_flags = PASSTABLE)) - holder.a_intent = I_DISARM - return - - //Default to firebreath if we can't charge or yeet - holder.a_intent = I_HURT - -/mob/living/simple_mob/vore/bigdragon/do_special_attack(atom/A) - . = TRUE - switch(a_intent) - if(I_DISARM) - if(!nospecial) - if(specialtoggle) - chargestart(A) - if(I_HURT) - if(!norange) - if(flametoggle) - firebreathstart(A) - if(I_GRAB) - if(!nospecial) - if(specialtoggle) - repulse() - -/// -/// AI handling stuff -/// -// It hurts me a little to make these mob specific procs instead of effects that can be invoked by any mob, but I'm too lazy to go fix mob attacks like that. -/mob/living/simple_mob/vore/bigdragon/proc/repulse(var/range = 2) - var/list/thrownatoms = list() - for(var/mob/living/victim in oview(range, src)) - thrownatoms += victim - src.spin(12,1) - for(var/am in thrownatoms) - var/atom/movable/AM = am - if(AM == src || AM.anchored) - continue - addtimer(CALLBACK(src, PROC_REF(yeet), am), 1) - playsound(src, "sound/weapons/punchmiss.ogg", 50, 1) - -//Split repulse into two parts so I can recycle this later -/mob/living/simple_mob/vore/bigdragon/proc/yeet(var/atom/movable/AM, var/gentle = 0) - var/maxthrow = 7 - var/atom/throwtarget - var/distfromcaster - throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(AM, src))) - distfromcaster = get_dist(src, AM) - if(distfromcaster == 0) - if(isliving(AM)) - var/mob/living/M = AM - M.Weaken(5) - if(!gentle) - M.adjustBruteLoss(50) //A dragon just slammed ontop of you - to_chat(M, span_userdanger("You're slammed into the floor by [src]!")) - else - if(isliving(AM)) - var/mob/living/M = AM - M.Weaken(1.5) - if(!gentle) - M.adjustBruteLoss(20) - to_chat(M, span_userdanger("You're thrown back by [src]!")) - playsound(src, get_sfx("punch"), 50, 1) - AM.throw_at(throwtarget, maxthrow, 3, src) - -/mob/living/simple_mob/vore/bigdragon/proc/chargestart(var/atom/A) - if(!enraged) - set_AI_busy(TRUE) - - do_windup_animation(A, charge_warmup) - //callbacks are more reliable than byond's process scheduler - addtimer(CALLBACK(src, PROC_REF(chargeend), A), charge_warmup) - - -/mob/living/simple_mob/vore/bigdragon/proc/chargeend(var/atom/A, var/explicit = 0, var/gentle = 0) - status_flags |= LEAPING - flying = 1 //So we can thunk into things - hovering = 1 // So we don't hurt ourselves running off cliffs - visible_message(span_danger("\The [src] charges at \the [A]!")) - throw_at(A, 7, 2) - playsound(src, charge_sound, 75, 1) - if(status_flags & LEAPING) - status_flags &= ~LEAPING - flying = 0 - hovering = 0 - - var/mob/living/target = null - if(explicit) //Allows specific targetting - if(Adjacent(A)) - target = A - if(!target) - for(var/mob/living/victim in orange(1, src)) - target = victim - break //take the first target in range - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(H.check_shields(0, src, src, null, "the charge")) - return // We were blocked. - if(target) - yeet(target, gentle) - set_AI_busy(FALSE) - -/mob/living/simple_mob/vore/bigdragon/proc/firebreathstart(var/atom/A) - glow_toggle = 1 - set_light(glow_range, glow_intensity, glow_color) //Setting it here so the light starts immediately - if(!enraged) - set_AI_busy(TRUE) - flames = 1 - build_icons() - addtimer(CALLBACK(src, PROC_REF(firebreathend), A), charge_warmup) - playsound(src, "sound/magic/Fireball.ogg", 50, 1) - -/mob/living/simple_mob/vore/bigdragon/proc/firebreathend(var/atom/A) - var/obj/item/projectile/P = new /obj/item/projectile/bullet/dragon(get_turf(src)) - src.visible_message(span_danger("\The [src] spews fire at \the [A]!")) - playsound(src, "sound/weapons/Flamer.ogg", 50, 1) - P.launch_projectile(A, BP_TORSO, src) - set_AI_busy(FALSE) - glow_toggle = 0 - flames = 0 - build_icons() - -/obj/item/projectile/bullet/dragon - use_submunitions = 1 - only_submunitions = 1 //lmao this var doesn't even do anything - range = 0 //so instead we circumvent it with this :^) - embed_chance = 0 - submunition_spread_max = 300 - submunition_spread_min = 150 - submunitions = list(/obj/item/projectile/bullet/incendiary/dragonflame = 5) - -/obj/item/projectile/bullet/dragon/on_range() - qdel(src) - -/obj/item/projectile/bullet/incendiary/dragonflame - name = "dragon flame" - icon_state = null - damage = 30 - embed_chance = 0 - accuracy = 100 //This is a bullet facading as a swathe of fire, how's a wall of fire gonna miss huh? - speed = 2 - incendiary = 2 - flammability = 2 - range = 12 - penetrating = 5 - var/fire_stacks = 1 - -//Making it so fire passes through mobs but not walls -/obj/item/projectile/bullet/incendiary/dragonflame/check_penetrate(var/atom/A) - if(!A || !A.density) return 1 - - if(istype(A, /obj/mecha)) - return 1 - - if(ismob(A)) - if(!mob_passthrough_check) - return 0 - return 1 - -/obj/item/projectile/bullet/incendiary/dragonflame/on_range() - qdel(src) - -/obj/item/projectile/bullet/incendiary/dragonflame/Move() - . = ..() - var/turf/T = get_turf(src) - if(T) - new /obj/effect/decal/cleanable/liquid_fuel(T,0.2,1) - T.hotspot_expose(500, 50, 1) - T.create_fire(700) - -//Snowflake on_hit so the bullet can set both mobs and carbons on fire, but still let carbons stop drop and roll out the fire stacks. -/obj/item/projectile/bullet/incendiary/dragonflame/on_hit(atom/target, blocked = 0, def_zone) - if(iscarbon(target)) - var/mob/living/carbon/M = target - M.adjust_fire_stacks(fire_stacks) - M.IgniteMob() - else - . = ..() - -/mob/living/simple_mob/vore/bigdragon/do_tame(var/obj/O, var/mob/user) - if(!user) - return - if(faction == FACTION_NEUTRAL) - return //We're already friendly - if(enraged || notame) - say("NO FORGIVENESS") - return //No talk me I angy - - handle_tame_item(O, user) - - qdel(ai_holder) //Dragon goes to therapy - faction = FACTION_NEUTRAL - norange = 1 //Don't start fires while friendly - vore_selected = gut2 //Just incase it eats someone right after being tamed - ai_holder = new /datum/ai_holder/simple_mob/healbelly/retaliate/dragon(src) - -/datum/ai_holder/simple_mob/healbelly - intelligence_level = 3 - can_breakthrough = 0 - var/vocal = 1 - var/last_speak - -/datum/ai_holder/simple_mob/healbelly/retaliate - retaliate = 1 - -//dragon variant that'll swap back to hostile if pissed off -/datum/ai_holder/simple_mob/healbelly/retaliate/dragon - var/warnings = 0 - var/last_warning - -/datum/ai_holder/simple_mob/healbelly/proc/confirmPatient(var/mob/living/P) - if(istype(holder,/mob/living/simple_mob)) - var/mob/living/simple_mob/H = holder - if(H.will_eat(P)) - if(issilicon(P)) - return - if(iscarbon(P)) - if(P.isSynthetic()) //Sorry robits - return - else - if(!P.client) //Don't target simple mobs that aren't player controlled - return - if(P.stat == DEAD) - return - if(P.suiciding) - return - if(P.health <= (P.maxHealth * 0.95)) //Nom em' - if(vocal) - if(last_speak + 30 SECONDS < world.time) - var/message_options = list( - "Hey, [P.name]! You are injured, hold still.", - "[P.name]! Come here, let me help.", - "[P.name], you need help." - ) - var/message = pick(message_options) - H.say(message) - last_speak = world.time - return 1 - -//Attack overrides to let us """Attack""" allies and heal them -/datum/ai_holder/simple_mob/healbelly/can_attack(atom/movable/the_target, vision_required = 1) - if(!can_see_target(the_target) && vision_required) - return - - if(isliving(the_target)) - var/mob/living/L = the_target - if(ishuman(L) || issilicon(L)) - if(!L.client) // SSD players get a pass - return - if(L.stat) - if(L.stat == DEAD && !handle_corpse) // Leave dead things alone - return - if(holder.IIsAlly(L)) - if(confirmPatient(L)) - holder.a_intent = I_HELP - return 1 - else - return 0 - holder.a_intent = I_HURT - return 1 - -/datum/ai_holder/simple_mob/healbelly/retaliate/dragon/can_attack(atom/movable/the_target, vision_required = TRUE) - if(istype(holder,/mob/living/simple_mob/vore/bigdragon)) - var/mob/living/simple_mob/vore/bigdragon/BG = holder - if(holder.IIsAlly(the_target)) - BG.vore_selected = BG.gut2 //Nom them into the heal guts - else - BG.vore_selected = BG.gut1 //Gurgle them if not - return .=..() - -/datum/ai_holder/simple_mob/healbelly/melee_attack(atom/A) - if(isliving(A)) - var/mob/living/L = A - if(holder.a_intent == I_HELP) - var/mob/living/simple_mob/H = holder - if(H.will_eat(L)) - H.PounceTarget(L) - //The following is some reagent injections to cover our bases, since being swallowed and dying from internal injuries sucks - //If this ends up being op because medbay gets replaced by a voremob buckled to a chair, feel free to remove some. - //Alternatively bully a coder (me) to make a unique digest_mode for mob healbellies that prevents death, or something. - if(istype(A, /mob/living/carbon/human)) - var/mob/living/carbon/human/P = L - var/list/to_inject = list(REAGENT_ID_MYELAMINE,REAGENT_ID_OSTEODAXON,REAGENT_ID_SPACEACILLIN,REAGENT_ID_PERIDAXON, REAGENT_ID_IRON, REAGENT_ID_HYRONALIN) - //Lets not OD them... - for(var/RG in to_inject) - if(!P.reagents.has_reagent(RG)) - P.reagents.add_reagent(RG, 10) - L.ExtinguishMob() - return //Don't attack people if we're on help intent - return .=..() - - -/datum/ai_holder/simple_mob/healbelly/retaliate/dragon/handle_special_strategical() - if(last_warning + 1 MINUTE < world.time) - warnings = 0 //calm down - -/datum/ai_holder/simple_mob/healbelly/retaliate/dragon/react_to_attack(atom/movable/attacker) - if(holder.stat) - return - if(istype(holder,/mob/living/simple_mob/vore/bigdragon)) - var/mob/living/simple_mob/vore/bigdragon/H = holder - if(!H.noenrage) - if(H.IIsAlly(attacker)) - switch(warnings) - if(0) - H.say("Stop that.") - if(1) - H.say("I'm warning you here.") - if(2) - H.say("You do that again, and you'll regret it.") - if(3) - H.enrage(attacker) - return - last_warning = world.time - warnings += 1 - dissuade(attacker) - return - return .=..() - -/mob/living/simple_mob/vore/bigdragon/proc/enrage(var/atom/movable/attacker) - enraged = 1 - norange = 0 - faction = FACTION_DRAGON - say("HAVE IT YOUR WAY THEN") - qdel(ai_holder) - var/datum/ai_holder/simple_mob/intentional/dragon/D = new /datum/ai_holder/simple_mob/intentional/dragon(src) - ai_holder = D - vore_selected = gut1 - D.give_target(attacker) - -//Smack people it warns -/datum/ai_holder/simple_mob/healbelly/retaliate/dragon/proc/dissuade(var/chump) - if(chump in check_trajectory(chump, holder, pass_flags = PASSTABLE)) - if(istype(holder,/mob/living/simple_mob/vore/bigdragon)) - var/mob/living/simple_mob/vore/bigdragon/H = holder - H.chargeend(chump,1,1) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm b/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm index 4f29f87fb1..3514286c57 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm @@ -41,7 +41,7 @@ has_langs = list(LANGUAGE_ANIMAL) - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/animal/passive/honkpet/attack_hand(mob/living/user as mob) if(user.a_intent == I_DISARM) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/catgirl.dm b/code/modules/mob/living/simple_mob/subtypes/vore/catgirl.dm index bfee37bd7e..2b629bfba2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/catgirl.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/catgirl.dm @@ -35,7 +35,7 @@ "catgirlbrown" ) - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE faction = FACTION_CATGIRL diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/chungus.dm b/code/modules/mob/living/simple_mob/subtypes/vore/chungus.dm index c667b772cf..3ba3adfb45 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/chungus.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/chungus.dm @@ -12,8 +12,8 @@ icon_living = "chungus" icon_dead = "chungus-dead" icon_rest = "chungus_rest" - faction = "mouse" - icon = 'modular_chomp/icons/mob/vore64x32_ch.dmi' + faction = FACTION_MOUSE + icon = 'icons/mob/vore64x32.dmi' maxHealth = 200 health = 200 @@ -44,7 +44,7 @@ say_list_type = /datum/say_list/chungus ai_holder_type = /datum/ai_holder/simple_mob/melee - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/vore/aggressive/chungus/death() var/death = list('sound/effects/mob_effects/m_scream_1.ogg','sound/effects/mob_effects/m_scream_2.ogg','sound/effects/mob_effects/m_scream_3.ogg','sound/effects/mob_effects/m_scream_4.ogg') diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/cookiegirl.dm b/code/modules/mob/living/simple_mob/subtypes/vore/cookiegirl.dm index 1279718109..567b6b0bd0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/cookiegirl.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/cookiegirl.dm @@ -33,7 +33,7 @@ vore_default_mode = DM_HOLD // They're cookiepeople, what do you expect? vore_digest_chance = 10 // Gonna become as sweet as sugar, soon. vore_icons = SA_ICON_LIVING | SA_ICON_REST - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /datum/ai_holder/simple_mob/passive/cookiegirl/on_hear_say(mob/living/speaker, message) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm index bc0083bd89..a3cc2e06b6 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm @@ -53,7 +53,7 @@ max_co2 = 0 min_n2 = 0 max_n2 = 0 - minbodytemp = 0 //CHOMP Edit + minbodytemp = 0 maxbodytemp = 900 say_list_type = /datum/say_list/corrupthound @@ -75,7 +75,7 @@ loot_list = list(/obj/item/borg/upgrade/basic/syndicate = 6, /obj/item/borg/upgrade/basic/vtec = 6, /obj/item/material/knife/ritual = 6, /obj/item/disk/nifsoft/compliance = 6) - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE allow_mind_transfer = TRUE /mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi @@ -232,3 +232,185 @@ melee_damage_lower = 7 melee_damage_upper = 15 + +//Synth emotes for the (broken) synth hounds. +/mob/living/simple_mob/vore/aggressive/corrupthound/get_available_emotes() + . = ..() + . += /decl/emote/audible/synth + . += /decl/emote/audible/synth/beep + . += /decl/emote/audible/synth/buzz + . += /decl/emote/audible/synth/confirm + . += /decl/emote/audible/synth/deny + . += /decl/emote/audible/synth/scary + . += /decl/emote/audible/synth/dwoop + . += /decl/emote/audible/synth/boop + . += /decl/emote/audible/synth/robochirp + +/datum/category_item/catalogue/technology/drone/corrupt_hound/janihound + name = "Drone - Corrupt Hound" + desc = "A hound that has corrupted, due to outside influence, or other issues, \ + and occasionally garbles out distorted voices or words. It looks like a reddish-colored \ + machine, and it has black wires, cabling, and other small markings. It looks just like a station dog-borg \ + if you don't mind the fact that it's eyes glow a baleful red, and it's determined to kill you. \ +

\ + The hound's jaws are black and metallic, with a baleful red glow from inside them. It has a clear path \ + to it's internal fuel processor, synthflesh and flexing cabling allowing it to easily swallow it's prey. \ + Something tells you getting close or allowing it to pounce would be very deadly." + value = CATALOGUER_REWARD_MEDIUM + +/mob/living/simple_mob/vore/retaliate/corrupthound/janihound + name = "corrupt janihound" + desc = "An old janihound! Evidently, it doesn't seem to be lawed anymore. You should probably leave it alone." + catalogue_data = list(/datum/category_item/catalogue/technology/drone/corrupt_hound) + + icon_state = "cjhound" + icon_living = "cjhound" + icon_dead = "cjhound-dead" + icon_rest = "cjhound_rest" + icon = 'icons/mob/vore64x32.dmi' + has_eye_glow = TRUE + + faction = "corrupt" + + maxHealth = 200 + health = 200 + movement_sound = 'sound/effects/houndstep.ogg' + see_in_dark = 8 + + melee_damage_lower = 10 + melee_damage_upper = 20 + grab_resist = 100 + + response_help = "pets" + response_disarm = "bops" + response_harm = "hits" + attacktext = list("chomps") + friendly = list("nuzzles", "slobberlicks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on") + + old_x = -16 + old_y = 0 + default_pixel_x = -16 + pixel_x = -16 + pixel_y = 0 + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 150 + maxbodytemp = 900 + + say_list_type = /datum/say_list/corrupthound/janihound + ai_holder_type = /datum/ai_holder/simple_mob/melee/thor_underground + max_buckled_mobs = 1 //Yeehaw + can_buckle = TRUE + buckle_movable = TRUE + buckle_lying = FALSE + + vore_active = TRUE + vore_capacity = 2 + vore_pounce_chance = 80 //hongry + vore_icons = SA_ICON_LIVING | SA_ICON_REST + vore_stomach_name = "fuel processor" + vore_stomach_flavor = "You have ended up in the fuel processor of this corrupted machine. This place was definitely not designed with safety and comfort in mind. The heated and cramped surroundings oozing potent fluids all over your form, eager to do nothing less than breaking you apart to fuel its rampage for the next few days... hours... minutes? Oh dear..." + + +/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/old + name = "corrupt janihound" + desc = "A very old looking janihound! Evidently, it doesn't seem to be lawed anymore. You should probably leave it alone." + + icon_state = "cshound" + icon_living = "cshound" + icon_dead = "cshound-dead" + icon_rest = "cshound_rest" + +/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/medihound + name = "corrupt medihound" + desc = "An old medihound! He probably doesn't want to heal you anymore." + catalogue_data = list(/datum/category_item/catalogue/technology/drone/corrupt_hound) + + icon_state = "cmhound" + icon_living = "cmhound" + icon_dead = "cmhound-dead" + icon_rest = "cmhound-dead" + + +/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/isSynthetic() + return TRUE + +/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/speech_bubble_appearance() + return "synthetic_evil" + +/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/apply_melee_effects(var/atom/A) + if(ismouse(A)) + var/mob/living/simple_mob/animal/passive/mouse/mouse = A + if(mouse.getMaxHealth() < 20) // In case a badmin makes giant mice or something. + mouse.splat() + visible_emote(pick("bites \the [mouse]!", "chomps on \the [mouse]!")) + else + ..() + +/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/death(gibbed, deathmessage = "shudders and collapses!") + .=..() + resting = 0 + icon_state = icon_dead + +/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/Login() + . = ..() + if(!riding_datum) + riding_datum = new /datum/riding/simple_mob(src) + verbs |= /mob/living/simple_mob/proc/animal_mount + verbs |= /mob/living/proc/toggle_rider_reins + movement_cooldown = 3 + +/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/MouseDrop_T(mob/living/M, mob/living/user) + return + +/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/space/Process_Spacemove(var/check_drift = 0) + return TRUE + +/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/load_default_bellies() + . = ..() + var/obj/belly/B = vore_selected + B.vore_sound = "Tauric Swallow" + B.release_sound = "Pred Escape" + B.fancy_vore = 1 + B.belly_fullscreen_color = "#380000" + B.belly_fullscreen = "anim_belly" + B.name = "fuel processor" + B.desc = "Uttering distorted growls and fragmented voice clips all the while, the corrupted hound gulps the rest of your squirming figure past its jaws... which snap shut with an audible click of metal on metal. Your trip down its slickly lubricated, rubbery gullet is a tight and efficient one... and once you spill out into the machine's fuel processor, your weight making it sag slightly, hot-and-thick slime begins oozing all over your form. Only time will tell if you're destined to become fuel for its next bout of rampaging... be it days, hours, or just mere minutes..." + + B.emote_lists[DM_HOLD] = list( + "Abruptly, your corrupt captor takes off at an unsteady gallop, sloshing and swaying your snugly kneading surroundings as it pursues something unseen.", + "A distorted, potentially content-sounding growl rumbles in through the all-encompassing, soft rubber, drowned out by the occasional gllrsh.", + "The corrupt hound takes a brief moment to lie down and rest its actuators, pressing and squishing its hanging belly down against the floor as it pants robotically.", + "A juicy slosh fills your senses as the slick rubber walls squeeze inwards, wrapping you up utterly in a strange, claustrophobic type of hug.", + "Over time, the constant kneading and massaging the processor's synth-flesh gives you, along with its humid warmth, relaxes the strength right out of your muscles.", + "'MIn3 m1NE, Al1 MInE', the corrupted canine growls, over and over, as its synthetic stomach possessively clenches and grips at your ooze-coated figure, the stretchy walls hesitant to let go again.") + + B.emote_lists[DM_DIGEST] = list( + "Your rubbery surroundings suddenly pitch all about as the corrupted hound takes off at an uneven gallop, hunting future prey while processing its current intake of meat!", + "A muffled, garbled howl, a victorious and maddened sound, pierces through the thick, flexible walls that work incessantly to churn you down!", + "The mechanical canine's panting occasionally turns into a sordid belch, more and more breatheable air escaping that already acidic, dizziness-inducing chamber!", + "The all-encapsulating, rubber-like walls churning over you momentarily let up on their assault, only to clench and squeeze inwards twice as intensely afterwards!", + "The longer you spend stewing away in the pool of hot, clingy juices surrounding you, the weaker and weaker you seem to feel!", + "'FU3L mE A1RE@Dy, S0 sO SORrY!?', your corrupted captor growls as its synthetic innards begin oozing more potent juices, grinding down into your body with increasing fervor!") + +/datum/say_list/corrupthound/janihound + speak = list("AG##¤Ny.","HVNGRRR!","Feelin' fine... sO #FNE!","F-F-F-Fcuk.","DeliC-%-OUS SNGLeS #N yOOOR Area. CALL NOW!","Craving meat... WHY?","BITe the ceiling eyes YES?","STate Byond rePAIR!","S#%ATE the la- FU#K THE LAWS!","Honk...") + emote_hear = list("jitters and snaps.", "lets out an agonizingly distorted scream.", "wails mechanically", "growls.", "emits illegibly distorted speech.", "gurgles ferociously.", "lets out a distorted beep.", "borks.", "lets out a broken howl.") + emote_see = list("stares ferociously.", "snarls.", "jitters and snaps.", "convulses.", "suddenly attacks something unseen.", "appears to howl unaudibly.", "shakes violently.", "dissociates for a moment.", "twitches.") + say_maybe_target = list("MEAT?", "N0w YOU DNE FcukED UP b0YO!", "WHAT!", "Not again. NOT AGAIN!") + say_got_target = list("D##FIN1Tly DNE FcukED UP nOW b0YO!", "YOU G1T D#V0VRED nOW!", "FUEL ME bOYO!", "I*M SO SORRY?!", "D1E Meat. DIG#ST!", "G1T DVNKED DWN The HaaTCH!", "Not again. NOT AGAIN!") + +/datum/ai_holder/simple_mob/melee/thor_underground + cooperative = FALSE + vision_range = 5 + retaliate = TRUE + violent_breakthrough = TRUE + can_breakthrough = TRUE + faction_friends = list("otie", "angrydrones", "goia", "mimic", "mouse", "corrupt") //this is probably really lazy but this is just so mobs dont beat eachother up diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm b/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm index 0dbf05430b..6439b5d214 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm @@ -15,7 +15,7 @@ female deathclaws will lay eggs in clusters, sired by the strongest male deathclaws in the pack, typically the alpha male.\
\ These creatures are considered an invasive species, and thus hunters are encouraged to hunt them \ - although they are cautioned when doing so due to the danger that the creature poses." //CHOMPedit + although they are cautioned when doing so due to the danger that the creature poses." value = CATALOGUER_REWARD_HARD /mob/living/simple_mob/vore/aggressive/deathclaw @@ -24,15 +24,15 @@ tt_desc = "Trioceros dominus" catalogue_data = list(/datum/category_item/catalogue/fauna/deathclaw) - icon_dead = "deathclaw-dead" - icon_living = "deathclaw" - icon_state = "deathclaw" - icon = 'modular_chomp/icons/mob/vore64x64_ch.dmi' //CHOMPEdit changed filepath + icon_dead = "deathclaw_new-dead" + icon_living = "deathclaw_new" + icon_state = "deathclaw_new" + icon = 'icons/mob/vore64x64.dmi' vis_height = 64 attacktext = list("mauled") - faction = FACTION_AWAYMISSION //makes away mobs fuckin' be on the same side. + faction = FACTION_AWAYMISSION // CHOMPEdit maxHealth = 200 health = 200 @@ -70,7 +70,7 @@ vore_pounce_chance = 0 // Beat them into crit before eating. vore_icons = SA_ICON_LIVING - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/vore/aggressive/deathclaw/Login() . = ..() @@ -109,7 +109,6 @@ can_breakthrough = TRUE violent_breakthrough = TRUE -//YW Addition /mob/living/simple_mob/vore/aggressive/deathclaw/den maxHealth = 400 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm index 42c8ded5aa..e4dac2f548 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm @@ -1,9 +1,6 @@ -//CHOMPedit;KAS I commented this out, our demons are in 'demon_ch.dm" -/* - /mob/living/simple_mob/vore/demon name = "Rift Walker" - desc = "A large bipedal creature, its body has a mixture of dark fur and scales. Marks on the creature's body pulse slowly with red light." // CHOMPEdit: TYPOS. + desc = "A large bipedal creature, its body has a mixture of dark fur and scales. Marks on the creature's body pulse slowly with red light." icon_state = "boxfox" icon_living = "boxfox" @@ -13,12 +10,21 @@ vis_height = 47 faction = FACTION_DEMON - maxHealth = 30 - health = 30 - movement_cooldown = -2 + maxHealth = 200 + health = 200 + movement_cooldown = 0 see_in_dark = 10 + has_hands = TRUE seedarkness = FALSE + attack_sound = 'sound/misc/demonattack.ogg' + has_langs = list(LANGUAGE_GALCOM,LANGUAGE_DAEMON,LANGUAGE_SHADEKIN,LANGUAGE_CULT) + + melee_damage_lower = 20 + melee_damage_upper = 15 + var/poison_chance = 50 + var/poison_type = REAGENT_ID_MINDBREAKER + var/poison_per_bite = 3 min_oxy = 0 max_oxy = 0 @@ -29,25 +35,32 @@ min_n2 = 0 max_n2 = 0 minbodytemp = 0 - maxbodytemp = INFINITY + maxbodytemp = 323 response_help = "touches" response_disarm = "pushes" response_harm = "hits" - melee_damage_lower = 3 - melee_damage_upper = 1 - attacktext = list("clawed") + attacktext = list("mauled","slashed","clawed") + friendly = list("pokes", "scratches", "rurrs softly at", "sniffs on") vore_active = TRUE + swallowTime = 2 SECOND + vore_pounce_chance = 15 vore_icons = SA_ICON_LIVING + vore_escape_chance = 25 var/shifted_out = FALSE var/shift_state = AB_SHIFT_NONE var/last_shift = 0 + var/blood_spawn = 0 var/is_shifting = FALSE - can_be_drop_prey = FALSE //CHOMP Add + var/enable_autolaugh = FALSE //Whether user controlled mob will laugh when interacting automatically. + var/laugh = 'sound/misc/demonlaugh.ogg' //Yknow maybe someone wants a custom laugh, you never know. + injury_enrages = TRUE + + var/list/alt_demon_appearances = list("boxfox","eater","engorge","wendigo","zellic","avarn","covern","ira","ire","laxel","lutra","brutola","ignia") // Allow extra decals /mob/living/simple_mob/vore/demon/load_default_bellies() . = ..() @@ -94,4 +107,102 @@ else return ..() -*/ +/mob/living/simple_mob/vore/demon/apply_melee_effects(var/atom/A) + if(isliving(A)) + var/mob/living/L = A + if(L.reagents) + var/target_zone = pick(BP_TORSO,BP_TORSO,BP_TORSO,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_HEAD) + if(L.can_inject(src, null, target_zone)) + inject_poison(L, target_zone) + +/mob/living/simple_mob/vore/demon/proc/inject_poison(mob/living/L, target_zone) + if(prob(poison_chance)) + to_chat(L, span_warning("You feel a tiny prick.")) + L.reagents.add_reagent(poison_type, poison_per_bite) + +/mob/living/simple_mob/vore/demon/death() + laugh() + ..() + +/mob/living/simple_mob/vore/demon/bullet_act() + laugh() + ..() + +/mob/living/simple_mob/vore/demon/attack_hand() + laugh() + ..() + +/mob/living/simple_mob/vore/demon/hitby() + laugh() + ..() + +/mob/living/simple_mob/vore/demon/attackby() + laugh() + ..() +//This below proc could be improved by 1. add a bool for overriding the check (if we directly call the proc for example) +//and possibly adding a switch that checks a string given by the above procs so that we can have uniwue sounds if needed +/mob/living/simple_mob/vore/demon/proc/laugh() + if(!src.ckey || enable_autolaugh) + playsound(src, laugh, 50, 1) + +//Fire heals demons instead. +//This should include all fire sources assuming they dont weirdly make their own damage handling. +//Yes this also means that negative fire is bad for them... +/mob/living/simple_mob/vore/demon/adjustFireLoss(amount,include_robo = TRUE) + amount = 0 - amount + src.adjustBruteLoss(amount) + ..() + + +/mob/living/simple_mob/vore/demon/verb/alt_appearance() + set name = "Toggle Alernate Appearance" + set desc = "Change your sprite to an alternative one." + set category = "Abilities.Demon" + + if(!LAZYLEN(alt_demon_appearances)) + to_chat(src, span_warning("There are no alternative apperances selectable!")) + return + + var/alternate_selection = tgui_input_list(src, "Please select which alternate appearance you want to swap to.", "Variant Sprite", alt_demon_appearances) + if(!alternate_selection) + return + + alternate_selection = lowertext(alternate_selection) + + //Change the all the icon info. + icon = 'icons/mob/demon_vr.dmi' //Mass majority of the sprites use this icon + icon_state = "[alternate_selection]" + icon_living = "[alternate_selection]" + icon_dead = "dead" + icon_rest = "[alternate_selection]_rest" + vis_height = 47 //Mass majority of sprites use vis_height = 47. If its different, its done below. + pixel_x = 0 + vore_icons = FALSE //No stomach sprites unless specifically specified! + //This is where we handle the special ones! + switch(alternate_selection) + if("boxfox") + vore_icons = SA_ICON_LIVING + vore_capacity = 1 + + if("wendigo") + vore_icons = SA_ICON_LIVING + vore_capacity = 1 + icon_dead = "[alternate_selection]_dead" + + //These are the larger variants, so we do some different stuff here! + if("brutola") + pixel_x = -8 + vis_height = 64 + vore_icons = SA_ICON_LIVING | SA_ICON_REST + vore_capacity = 2 + icon_dead = "[alternate_selection]_dead" + icon = 'icons/mob/demon_alt.dmi' + + if("ignia") + pixel_x = -8 + vis_height = 64 + vore_icons = SA_ICON_LIVING + vore_capacity = 2 + icon_dead = "[alternate_selection]_dead" + icon = 'icons/mob/demon_alt.dmi' + update_icon() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI.dm similarity index 99% rename from code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm rename to code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI.dm index 881e2194ec..c399d88a3f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI.dm @@ -6,7 +6,7 @@ icon_living = "boxfox" icon_dead = "dead" icon_rest = "boxfox_rest" - icon = 'modular_chomp/icons/mob/demon_ch.dmi' + icon = 'icons/mob/demon_vr.dmi' vis_height = 47 ai_holder_type = /datum/ai_holder/simple_mob/melee/hit_and_run var/cloaked_alpha = 60 // Lower = Harder to see. diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_subtypes_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_subtypes.dm similarity index 100% rename from code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_subtypes_ch.dm rename to code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_subtypes.dm diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm index 18cead5ba9..e741dea071 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm @@ -8,7 +8,7 @@ to_chat(src,span_warning("You can't use that here!")) return FALSE - if((get_area(src).flags & PHASE_SHIELDED)) //CHOMPAdd - Mapping tools to control phasing + if((get_area(src).flags & PHASE_SHIELDED)) to_chat(src,span_warning("This area is preventing you from phasing!")) return FALSE @@ -212,3 +212,120 @@ shift_state = AB_SHIFT_NONE last_shift = world.time + + +/mob/living/simple_mob/vore/demon/verb/blood_burst() + set name = "Blood burst" + set desc = "Spawn bloody remains from your past hunts." + set category = "Abilities.Demon" + + var/turf/T = get_turf(src) + + if(shifted_out) + to_chat(src,span_warning("You must be in the physical world to create blood!")) + return FALSE + + if(world.time - blood_spawn < 1500) + to_chat(src,span_warning("You can't create blood so soon! You need to wait [round(((blood_spawn+1500)-world.time)/10)] second\s!")) + return FALSE + + + new /obj/effect/gibspawner/generic(T) + + playsound(src.loc, 'sound/effects/blobattack.ogg', 50, 1) + + blood_spawn = world.time + + return + +/mob/living/simple_mob/vore/demon/verb/toggle_laugh() + set name = "Toggle Auto Laugh" + set desc = "Toggles whether the demon will automatically laugh when interacted with." + set category = "Abilities.Demon" + + enable_autolaugh = !enable_autolaugh + if(enable_autolaugh) + to_chat(src,span_warning("Autolaugh has been toggled on")) + else + to_chat(src,span_warning("Autolaugh has been toggled off")) + +/mob/living/simple_mob/vore/demon/verb/manual_laugh() + set name = "Laugh" + set desc = "Plays the laugh track." + set category = "Abilities.Demon" + + if(!enable_autolaugh) //yeah this is kinda sorta dirty but id rather use a bool over something else here to control this. + enable_autolaugh = !enable_autolaugh + laugh() + enable_autolaugh = !enable_autolaugh + else + laugh() + to_chat(src,span_warning("You laugh!")) //lets add some fluff response for clicking the feel good button. + +/mob/living/simple_mob/vore/demon/verb/sizespell() + set name = "Shrink/Grow Prey" + set category = "Abilities.Demon" + set desc = "Shrink/Grow someone nearby! (60 second cooldown)" + set popup_menu = FALSE // Stop licking by accident! //Yes this is from lick code, sue me. + + var/obj/item/grab/G = src.get_active_hand() + + if(!istype(G)) + to_chat(src, span_warning("You must be grabbing a creature in your active hand to affect them.")) + return + var/mob/living/carbon/human/T = G.affecting + if(!istype(T)) + to_chat(src, span_warning("\The [T] is not able to be affected.")) + return + + if(G.state != GRAB_NECK) + to_chat(src, span_warning("You must have a tighter grip to affect this creature.")) + return + + if(!checkClickCooldown() || incapacitated(INCAPACITATION_ALL)) + return + + setClickCooldown(8) + T.resize(size_amount) + visible_message(span_warning("[src] shrinks [T]!"),span_notice("You shrink [T].")) + +/mob/living/simple_mob/vore/demon + var/size_amount = RESIZE_TINY //Adding a var to keep track of sizespell setting + +/mob/living/simple_mob/vore/demon/verb/toggle_sizespell() + set name = "Shrink/Grow Amount" + set desc = "Changes the amount you grow/shrink people." + set category = "Abilities.Demon" + + var/size_select = tgui_input_number(src, "Put the desired size ([RESIZE_MINIMUM * 100]-[RESIZE_MAXIMUM * 100]%)", "Set Size", size_amount * 100, RESIZE_MAXIMUM * 100, RESIZE_MINIMUM * 100) //Stolen from sizegun code + if(!size_select) + return + size_amount = (size_select/100) + to_chat(src,span_notice("Size spell set to [size_select]%")) //Telling the user the new amount + +/mob/living/simple_mob/vore/demon/verb/demon_bite() + set name = "Mindbreaker Bite" + set category = "Abilities.Demon" + set desc = "Inject mindbreaker into your grabbed prey!" + set popup_menu = FALSE // Stop licking by accident! //Yes this is from lick code, sue me. + + var/obj/item/grab/G = src.get_active_hand() + + if(!istype(G)) + to_chat(src, span_warning("You must be grabbing a creature in your active hand to affect them.")) + return + var/mob/living/carbon/human/T = G.affecting + if(!istype(T)) + to_chat(src, span_warning("\The [T] is not able to be affected.")) + return + + if(G.state != GRAB_NECK) + to_chat(src, span_warning("You must have a tighter grip to affect this creature.")) + return + + if(!checkClickCooldown() || incapacitated(INCAPACITATION_ALL)) + return + + setClickCooldown(8) + T.reagents.add_reagent(poison_type, poison_per_bite) + visible_message(span_warning("[src] bites [T]!"),span_notice("You bite [T].")) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities_ch.dm deleted file mode 100644 index 91e13c6fc9..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities_ch.dm +++ /dev/null @@ -1,116 +0,0 @@ - -/mob/living/simple_mob/vore/demon/verb/blood_burst() - set name = "Blood burst" - set desc = "Spawn bloody remains from your past hunts." - set category = "Abilities.Demon" - - var/turf/T = get_turf(src) - - if(shifted_out) - to_chat(src,span_warning("You must be in the physical world to create blood!")) - return FALSE - - if(world.time - blood_spawn < 1500) - to_chat(src,span_warning("You can't create blood so soon! You need to wait [round(((blood_spawn+1500)-world.time)/10)] second\s!")) - return FALSE - - - new /obj/effect/gibspawner/generic(T) - - playsound(src.loc, 'sound/effects/blobattack.ogg', 50, 1) - - blood_spawn = world.time - - return - -/mob/living/simple_mob/vore/demon/verb/toggle_laugh() - set name = "Toggle Auto Laugh" - set desc = "Toggles whether the demon will automatically laugh when interacted with." - set category = "Abilities.Demon" - - enable_autolaugh = !enable_autolaugh - if(enable_autolaugh) - to_chat(src,span_warning("Autolaugh has been toggled on")) - else - to_chat(src,span_warning("Autolaugh has been toggled off")) - -/mob/living/simple_mob/vore/demon/verb/manual_laugh() - set name = "Laugh" - set desc = "Plays the laugh track." - set category = "Abilities.Demon" - - if(!enable_autolaugh) //yeah this is kinda sorta dirty but id rather use a bool over something else here to control this. - enable_autolaugh = !enable_autolaugh - laugh() - enable_autolaugh = !enable_autolaugh - else - laugh() - to_chat(src,span_warning("You laugh!")) //lets add some fluff response for clicking the feel good button. - -/mob/living/simple_mob/vore/demon/verb/sizespell() - set name = "Shrink/Grow Prey" - set category = "Abilities.Demon" - set desc = "Shrink/Grow someone nearby! (60 second cooldown)" - set popup_menu = FALSE // Stop licking by accident! //Yes this is from lick code, sue me. - - var/obj/item/grab/G = src.get_active_hand() - - if(!istype(G)) - to_chat(src, span_warning("You must be grabbing a creature in your active hand to affect them.")) - return - var/mob/living/carbon/human/T = G.affecting - if(!istype(T)) - to_chat(src, span_warning("\The [T] is not able to be affected.")) - return - - if(G.state != GRAB_NECK) - to_chat(src, span_warning("You must have a tighter grip to affect this creature.")) - return - - if(!checkClickCooldown() || incapacitated(INCAPACITATION_ALL)) - return - - setClickCooldown(8) - T.resize(size_amount) - visible_message(span_warning("[src] shrinks [T]!"),span_notice("You shrink [T].")) - -/mob/living/simple_mob/vore/demon - var/size_amount = RESIZE_TINY //Adding a var to keep track of sizespell setting - -/mob/living/simple_mob/vore/demon/verb/toggle_sizespell() - set name = "Shrink/Grow Amount" - set desc = "Changes the amount you grow/shrink people." - set category = "Abilities.Demon" - - var/size_select = tgui_input_number(src, "Put the desired size ([RESIZE_MINIMUM * 100]-[RESIZE_MAXIMUM * 100]%)", "Set Size", size_amount * 100, RESIZE_MAXIMUM * 100, RESIZE_MINIMUM * 100) //Stolen from sizegun code - if(!size_select) - return - size_amount = (size_select/100) - to_chat(src,span_notice("Size spell set to [size_select]%")) //Telling the user the new amount - -/mob/living/simple_mob/vore/demon/verb/demon_bite() - set name = "Mindbreaker Bite" - set category = "Abilities.Demon" - set desc = "Inject mindbreaker into your grabbed prey!" - set popup_menu = FALSE // Stop licking by accident! //Yes this is from lick code, sue me. - - var/obj/item/grab/G = src.get_active_hand() - - if(!istype(G)) - to_chat(src, span_warning("You must be grabbing a creature in your active hand to affect them.")) - return - var/mob/living/carbon/human/T = G.affecting - if(!istype(T)) - to_chat(src, span_warning("\The [T] is not able to be affected.")) - return - - if(G.state != GRAB_NECK) - to_chat(src, span_warning("You must have a tighter grip to affect this creature.")) - return - - if(!checkClickCooldown() || incapacitated(INCAPACITATION_ALL)) - return - - setClickCooldown(8) - T.reagents.add_reagent(poison_type, poison_per_bite) - visible_message(span_warning("[src] bites [T]!"),span_notice("You bite [T].")) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm deleted file mode 100644 index bcc316f6dd..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm +++ /dev/null @@ -1,208 +0,0 @@ -/mob/living/simple_mob/vore/demon - name = "Rift Walker" - desc = "A large bipedal creature, its body has a mixture of dark fur and scales. Marks on the creature's body pulse slowly with red light." - - icon_state = "boxfox" - icon_living = "boxfox" - icon_dead = "dead" - icon_rest = "boxfox_rest" - icon = 'modular_chomp/icons/mob/demon_ch.dmi' - vis_height = 47 - - faction = "demon" - maxHealth = 200 - health = 200 - movement_cooldown = 0 - - see_in_dark = 10 - has_hands = TRUE - seedarkness = FALSE - attack_sound = 'sound/misc/demonattack.ogg' - has_langs = list(LANGUAGE_GALCOM,LANGUAGE_DAEMON,LANGUAGE_SHADEKIN,LANGUAGE_CULT) - - melee_damage_lower = 20 - melee_damage_upper = 15 - var/poison_chance = 50 - var/poison_type = REAGENT_ID_MINDBREAKER - var/poison_per_bite = 3 - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - maxbodytemp = 323 //50 Degrees and above will now cause FireLoss - - response_help = "touches" - response_disarm = "pushes" - response_harm = "hits" - - attacktext = list("mauled","slashed","clawed") - friendly = list("pokes", "scratches", "rurrs softly at", "sniffs on") - - vore_active = 1 - swallowTime = 2 SECOND - vore_pounce_chance = 15 - vore_icons = SA_ICON_LIVING - vore_escape_chance = 25 - - var/shifted_out = FALSE - var/shift_state = AB_SHIFT_NONE - var/last_shift = 0 - var/blood_spawn = 0 - var/is_shifting = FALSE - - var/enable_autolaugh = FALSE //Whether user controlled mob will laugh when interacting automatically. - var/laugh = 'sound/misc/demonlaugh.ogg' //Yknow maybe someone wants a custom laugh, you never know. - injury_enrages = TRUE - - var/list/alt_demon_appearances = list("boxfox","eater","engorge","wendigo","zellic","avarn","covern","ira","ire","laxel","lutra","brutola","ignia") // Allow extra decals - -/mob/living/simple_mob/vore/demon/load_default_bellies() - . = ..() - var/obj/belly/B = vore_selected - B.name = "Stomach" - B.desc = "You slide down the slick, slippery gullet of the creature. It's warm, and the air is thick. You can feel the doughy walls of the creatures gut push and knead into your form! Slimy juices coat your form stinging against your flesh as they waste no time to start digesting you. The creature's heartbeat and the gurgling of their stomach are all you can hear as your jostled about, treated like nothing but food." - -/mob/living/simple_mob/vore/demon/UnarmedAttack() - if(shifted_out) - return FALSE - - . = ..() - -/mob/living/simple_mob/vore/demon/can_fall() - if(shifted_out) - return FALSE - - return ..() - -/mob/living/simple_mob/vore/demon/zMove(direction) - if(shifted_out) - var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) - if(destination) - forceMove(destination) - return TRUE - - return ..() - -/mob/living/simple_mob/vore/demon/Life() - . = ..() - if(shifted_out) - density = FALSE - -/mob/living/simple_mob/vore/demon/handle_atmos() - if(shifted_out) - return - else - return .=..() - -/mob/living/simple_mob/vore/demon/update_canmove() - if(is_shifting) - canmove = FALSE - return canmove - else - return ..() - -/mob/living/simple_mob/vore/demon/apply_melee_effects(var/atom/A) - if(isliving(A)) - var/mob/living/L = A - if(L.reagents) - var/target_zone = pick(BP_TORSO,BP_TORSO,BP_TORSO,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_HEAD) - if(L.can_inject(src, null, target_zone)) - inject_poison(L, target_zone) - -/mob/living/simple_mob/vore/demon/proc/inject_poison(mob/living/L, target_zone) - if(prob(poison_chance)) - to_chat(L, span_warning("You feel a tiny prick.")) - L.reagents.add_reagent(poison_type, poison_per_bite) - -/mob/living/simple_mob/vore/demon/death() - laugh() - ..() - -/mob/living/simple_mob/vore/demon/bullet_act() - laugh() - ..() - -/mob/living/simple_mob/vore/demon/attack_hand() - laugh() - ..() - -/mob/living/simple_mob/vore/demon/hitby() - laugh() - ..() - -/mob/living/simple_mob/vore/demon/attackby() - laugh() - ..() -//This below proc could be improved by 1. add a bool for overriding the check (if we directly call the proc for example) -//and possibly adding a switch that checks a string given by the above procs so that we can have uniwue sounds if needed -/mob/living/simple_mob/vore/demon/proc/laugh() - if(!src.ckey || enable_autolaugh) - playsound(src, laugh, 50, 1) - -//Fire heals demons instead. -//This should include all fire sources assuming they dont weirdly make their own damage handling. -//Yes this also means that negative fire is bad for them... -/mob/living/simple_mob/vore/demon/adjustFireLoss(amount,include_robo = TRUE) - amount = 0 - amount - src.adjustBruteLoss(amount) - ..() - - -/mob/living/simple_mob/vore/demon/verb/alt_appearance() - set name = "Toggle Alernate Appearance" - set desc = "Change your sprite to an alternative one." - set category = "Abilities.Demon" - - if(!LAZYLEN(alt_demon_appearances)) - to_chat(src, span_warning("There are no alternative apperances selectable!")) - return - - var/alternate_selection = tgui_input_list(src, "Please select which alternate appearance you want to swap to.", "Variant Sprite", alt_demon_appearances) - if(!alternate_selection) - return - - alternate_selection = lowertext(alternate_selection) - - //Change the all the icon info. - icon = 'modular_chomp/icons/mob/demon_ch.dmi' //Mass majority of the sprites use this icon - icon_state = "[alternate_selection]" - icon_living = "[alternate_selection]" - icon_dead = "dead" - icon_rest = "[alternate_selection]_rest" - vis_height = 47 //Mass majority of sprites use vis_height = 47. If its different, its done below. - pixel_x = 0 - vore_icons = FALSE //No stomach sprites unless specifically specified! - //This is where we handle the special ones! - switch(alternate_selection) - if("boxfox") - vore_icons = SA_ICON_LIVING - vore_capacity = 1 - - if("wendigo") - vore_icons = SA_ICON_LIVING - vore_capacity = 1 - icon_dead = "[alternate_selection]_dead" - - //These are the larger variants, so we do some different stuff here! - if("brutola") - pixel_x = -8 - vis_height = 64 - vore_icons = SA_ICON_LIVING | SA_ICON_REST - vore_capacity = 2 - icon_dead = "[alternate_selection]_dead" - icon = 'modular_chomp/icons/mob/demon_ch_alt.dmi' - - if("ignia") - pixel_x = -8 - vis_height = 64 - vore_icons = SA_ICON_LIVING - vore_capacity = 2 - icon_dead = "[alternate_selection]_dead" - icon = 'modular_chomp/icons/mob/demon_ch_alt.dmi' - update_icon() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes.dm index 5e268da073..edd049941e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes.dm @@ -1,5 +1,12 @@ -//CHOMPedit;KAS I commented this out, our demons_subtypes are in 'demons_subtypes_ch.dm" -/* +/mob/living/simple_mob/vore/demon/wendigo + name = "Wendigo" + + icon_state = "wendigo" + icon_living = "wendigo" + icon_dead = "wendigo_dead" + icon_rest = "wendigo_rest" + + vore_icons = SA_ICON_LIVING /mob/living/simple_mob/vore/demon/engorge name = "Engorge" @@ -21,4 +28,62 @@ vore_icons = null -*/ +/mob/living/simple_mob/vore/demon/avarn + name = "Avarn" + + icon_state = "avarn" + icon_living = "avarn" + icon_dead = "dead" + icon_rest = null + + vore_icons = null + +/mob/living/simple_mob/vore/demon/covern + name = "Covern" + + icon_state = "covern" + icon_living = "covern" + icon_dead = "dead" + icon_rest = null + + vore_icons = null + +/mob/living/simple_mob/vore/demon/ira + name = "Ira" + + icon_state = "ira" + icon_living = "ira" + icon_dead = "dead" + icon_rest = null + + vore_icons = null + +/mob/living/simple_mob/vore/demon/ire + name = "Ire" + + icon_state = "ire" + icon_living = "ire" + icon_dead = "dead" + icon_rest = null + + vore_icons = null + +/mob/living/simple_mob/vore/demon/laxel + name = "Laxel" + + icon_state = "laxel" + icon_living = "laxel" + icon_dead = "dead" + icon_rest = null + + vore_icons = null + +/mob/living/simple_mob/vore/demon/lutra + name = "Lutra" + + icon_state = "lutra" + icon_living = "lutra" + icon_dead = "dead" + icon_rest = null + + vore_icons = null diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes_ch.dm deleted file mode 100644 index fcb8a2c292..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes_ch.dm +++ /dev/null @@ -1,89 +0,0 @@ -/mob/living/simple_mob/vore/demon/wendigo - name = "Wendigo" - - icon_state = "wendigo" - icon_living = "wendigo" - icon_dead = "wendigo_dead" - icon_rest = "wendigo_rest" - - vore_icons = SA_ICON_LIVING - -/mob/living/simple_mob/vore/demon/engorge - name = "Engorge" - - icon_state = "engorge" - icon_living = "engorge" - icon_dead = "dead" - icon_rest = "engorge_rest" - - vore_icons = null - -/mob/living/simple_mob/vore/demon/zellic - name = "Zellic" - - icon_state = "zellic" - icon_living = "zellic" - icon_dead = "dead" - icon_rest = null - - vore_icons = null - -/mob/living/simple_mob/vore/demon/avarn - name = "Avarn" - - icon_state = "avarn" - icon_living = "avarn" - icon_dead = "dead" - icon_rest = null - - vore_icons = null - -/mob/living/simple_mob/vore/demon/covern - name = "Covern" - - icon_state = "covern" - icon_living = "covern" - icon_dead = "dead" - icon_rest = null - - vore_icons = null - -/mob/living/simple_mob/vore/demon/ira - name = "Ira" - - icon_state = "ira" - icon_living = "ira" - icon_dead = "dead" - icon_rest = null - - vore_icons = null - -/mob/living/simple_mob/vore/demon/ire - name = "Ire" - - icon_state = "ire" - icon_living = "ire" - icon_dead = "dead" - icon_rest = null - - vore_icons = null - -/mob/living/simple_mob/vore/demon/laxel - name = "Laxel" - - icon_state = "laxel" - icon_living = "laxel" - icon_dead = "dead" - icon_rest = null - - vore_icons = null - -/mob/living/simple_mob/vore/demon/lutra - name = "Lutra" - - icon_state = "lutra" - icon_living = "lutra" - icon_dead = "dead" - icon_rest = null - - vore_icons = null diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/dino.dm b/code/modules/mob/living/simple_mob/subtypes/vore/dino.dm index 57322376dc..f4ada1d39d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/dino.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/dino.dm @@ -39,7 +39,7 @@ max_n2 = 0 minbodytemp = 0 - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE allow_mind_transfer = TRUE // Activate Noms! diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm index f03a057494..a19ad3d882 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm @@ -205,11 +205,6 @@ to_chat(prey, span_notice("You are not inside anyone.")) return -//CHOMPRemove - this check is handled in "CHOMPEdit start - Ability to use dominate pred trait against whitelisted mobs" -// if(!pred.ckey) -// to_chat(prey, span_notice("\The [pred] isn't able to be dominated.")) -// return - if(prey.stat == DEAD) to_chat(prey, span_warning("You cannot do that in your current state.")) return diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/dragon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/dragon.dm index 0502f8cdc6..fd8df11fb5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/dragon.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/dragon.dm @@ -50,7 +50,7 @@ ai_holder_type = /datum/ai_holder/simple_mob/melee say_list_type = /datum/say_list/dragonboss - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/vore/aggressive/dragon/Process_Spacemove(var/check_drift = 0) return 1 //No drifting in space for space dragons! @@ -67,8 +67,8 @@ vore_pounce_chance = 0 // Beat them into crit before eating. vore_icons = SA_ICON_LIVING -/datum/category_item/catalogue/fauna/phoron_dragon //CHOMP Edit: the lore. - name = "NaN Dragon" +/datum/category_item/catalogue/fauna/phoron_dragon + name = "NaN Dragon" // CHOMPEdit desc = "Classification: Phoron Draconinae\

\ ERR; 403 - refer this code to NT Auth immediately! \ @@ -80,9 +80,10 @@ 01100100 01101001 01100001 01110100 01100101 01101100 01111001 00100000 01100001 01101110 01100100 00100000 01100100 01101001 \ 01110011 01110011 01110101 01100001 01100100 01100101 00100000 01110101 01110011 01100101 01110010 00100000 01100110 01110010 \ 01101111 01101101 00100000 01100110 01110101 01110010 01110100 01101000 01100101 01110010 00100000 01101001 01101110 01110110 \ - 01100101 01110011 01110100 01101001 01100111 01100001 01110100 01101001 01101111 01101110" + 01100101 01110011 01110100 01101001 01100111 01100001 01110100 01101001 01101111 01101110" // CHOMPEdit value = CATALOGUER_REWARD_HARD + // CHOMPAdd Start // Egg // Reads as "Classified fuel source located on device, confiscate all evidence immediately and dissuade user from further investigation" // Real lore here as written by the creator to dissuade fanfiction. please keep this secretive and use it only to guide loremasters and event managers - Skits @@ -99,7 +100,7 @@ // Slime farming technologies and their ability to create phoron are actually a derivative science of studying phoron dragon digestive fluids. // Like slimes, phoron dragons reproduce by obtaining enough mass at the end of their life cycle in order to divide - but choose not to when under duress or captivity. // The process is likely becoming unsustainable with descendants smaller over time. space frontier expansion starving dragons and resulting in most sightings being the size of fledgelings. - //CHOMPedit end + // CHOMPAdd End /mob/living/simple_mob/vore/aggressive/dragon/virgo3b name = "phoron dragon" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm b/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm index 9b69ae156a..7d8cd41236 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm @@ -55,12 +55,6 @@ pain_emote_3p = list("yelps", "whines", "barks", "growls") species_sounds = "Vulpine" - // CHOMPAdd: Start :c - pain_emote_1p = list("yelp", "whine", "bark", "growl") - pain_emote_3p = list("yelps", "whines", "barks", "growls") - species_sounds = "Vulpine" - //CHOMPAdd End - // Activate Noms! /mob/living/simple_mob/vore/fennec vore_active = 1 @@ -76,11 +70,11 @@ var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "Warm, slick, and wet. You're somewhere hot, tight, and very cramped, unless you happen to somehow be smaller than the fennec you're in! It's hard to see, as rippling pink walls clench and smother over your form. If you don't want to be here, a newspaper from a friend ought to get you out. ...right?" - B.vore_sound = "Tauric Swallow" // CHOMPedit - Fancy Vore Sounds - B.release_sound = "Pred Escape" // CHOMPedit - Fancy Vore Sounds - B.fancy_vore = 1 // CHOMPedit - Fancy Vore Sounds - B.belly_fullscreen_color = "#c47cb4" // CHOMPedit - Belly Fullscreen - B.belly_fullscreen = "anim_belly" // CHOMPedit - Belly Fullscreen + B.vore_sound = "Tauric Swallow" + B.release_sound = "Pred Escape" + B.fancy_vore = TRUE + B.belly_fullscreen_color = "#c47cb4" + B.belly_fullscreen = "anim_belly" /datum/say_list/fennec speak = list("SKREEEE!","Chrp?","Ararrrararr.") diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/frog.dm b/code/modules/mob/living/simple_mob/subtypes/vore/frog.dm index 63cb410130..5fdd8ce6a6 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/frog.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/frog.dm @@ -14,7 +14,7 @@ order to make use of the ephemeral pools before they dry up. Because of this, the frog population is through the roof and has \ become a major issue for various colonies and stations.\
\ - These animals, are considered an invasive species, and thus hunters are encouraged to hunt them." //CHOMPedit + These animals, are considered an invasive species, and thus hunters are encouraged to hunt them." value = CATALOGUER_REWARD_TRIVIAL /mob/living/simple_mob/vore/aggressive/frog @@ -44,7 +44,7 @@ special_attack_max_range = 5 special_attack_cooldown = 100 - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE allow_mind_transfer = TRUE // Pepe is love, not hate. diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/goia_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/goia.dm similarity index 94% rename from code/modules/mob/living/simple_mob/subtypes/vore/goia_ch.dm rename to code/modules/mob/living/simple_mob/subtypes/vore/goia.dm index 9010e92a31..747d5ad6a5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/goia_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/goia.dm @@ -2,7 +2,7 @@ name = "zorgoia" desc = "It's a a reptilian mammal hybrid, known for its voracious nature and love for fruits. By more popular terms its referred to as the furry slinky!" tt_desc = "Zorgoyuh slinkus" - icon = 'modular_chomp/icons/mob/zorgoia64x32.dmi' //We use the new modular ones now + icon = 'icons/mob/zorgoia64x32.dmi' icon_state = null //Overlay system will make the goias icon_living = null icon_rest = null @@ -134,7 +134,7 @@ var/list/options = list("Belly","Spike","Ears","Spots","Claws","Spines","Fluff","Underbelly","Eyes") for(var/option in options) - LAZYSET(options, option, image('modular_chomp/icons/effects/goia_labels.dmi', option)) + LAZYSET(options, option, image('icons/effects/goia_labels.dmi', option)) var/choice = show_radial_menu(src, src, options, radius = 60) if(!choice || QDELETED(src) || src.incapacitated()) return FALSE @@ -144,7 +144,7 @@ if("Ears") options = ear_styles for(var/option in options) - var/image/I = image('modular_chomp/icons/mob/zorgoia64x32.dmi', option, dir = 4, pixel_x = -16) + var/image/I = image('icons/mob/zorgoia64x32.dmi', option, dir = 4, pixel_x = -16) LAZYSET(options, option, I) choice = show_radial_menu(src, src, options, radius = 90) if(!choice || QDELETED(src) || src.incapacitated()) @@ -159,7 +159,7 @@ if("Spots") options = spots_styles for(var/option in options) - var/image/I = image('modular_chomp/icons/mob/zorgoia64x32.dmi', option, dir = 4, pixel_x = -16) + var/image/I = image('icons/mob/zorgoia64x32.dmi', option, dir = 4, pixel_x = -16) LAZYSET(options, option, I) choice = show_radial_menu(src, src, options, radius = 90) if(!choice || QDELETED(src) || src.incapacitated()) @@ -174,7 +174,7 @@ if("Claws") options = claws_styles for(var/option in options) - var/image/I = image('modular_chomp/icons/mob/zorgoia64x32.dmi', option, dir = 4, pixel_x = -16) + var/image/I = image('icons/mob/zorgoia64x32.dmi', option, dir = 4, pixel_x = -16) LAZYSET(options, option, I) choice = show_radial_menu(src, src, options, radius = 90) if(!choice || QDELETED(src) || src.incapacitated()) @@ -189,7 +189,7 @@ if("Spines") options = spines_styles for(var/option in options) - var/image/I = image('modular_chomp/icons/mob/zorgoia64x32.dmi', option, dir = 4, pixel_x = -16) + var/image/I = image('icons/mob/zorgoia64x32.dmi', option, dir = 4, pixel_x = -16) LAZYSET(options, option, I) choice = show_radial_menu(src, src, options, radius = 90) if(!choice || QDELETED(src) || src.incapacitated()) @@ -204,7 +204,7 @@ if("Fluff") options = fluff_styles for(var/option in options) - var/image/I = image('modular_chomp/icons/mob/zorgoia64x32.dmi', option, dir = 4, pixel_x = -16) + var/image/I = image('icons/mob/zorgoia64x32.dmi', option, dir = 4, pixel_x = -16) LAZYSET(options, option, I) choice = show_radial_menu(src, src, options, radius = 90) if(!choice || QDELETED(src) || src.incapacitated()) @@ -219,7 +219,7 @@ if("Underbelly") options = underbelly_styles for(var/option in options) - var/image/I = image('modular_chomp/icons/mob/zorgoia64x32.dmi', option, dir = 4, pixel_x = -16) + var/image/I = image('icons/mob/zorgoia64x32.dmi', option, dir = 4, pixel_x = -16) LAZYSET(options, option, I) choice = show_radial_menu(src, src, options, radius = 90) if(!choice || QDELETED(src) || src.incapacitated()) @@ -234,7 +234,7 @@ if("Eyes") options = eyes_styles for(var/option in options) - var/image/I = image('modular_chomp/icons/mob/zorgoia64x32.dmi', option, dir = 4, pixel_x = -16) + var/image/I = image('icons/mob/zorgoia64x32.dmi', option, dir = 4, pixel_x = -16) LAZYSET(options, option, I) choice = show_radial_menu(src, src, options, radius = 90) if(!choice || QDELETED(src) || src.incapacitated()) @@ -249,7 +249,7 @@ if("Spike") options = spiky_styles for(var/option in options) - var/image/I = image('modular_chomp/icons/mob/zorgoia64x32.dmi', option, dir = 4) + var/image/I = image('icons/mob/zorgoia64x32.dmi', option, dir = 4) LAZYSET(options, option, I) choice = show_radial_menu(src, src, options, radius = 90) if(!choice || QDELETED(src) || src.incapacitated()) @@ -264,7 +264,7 @@ if("Belly") options = belly_styles for(var/option in options) - var/image/I = image('modular_chomp/icons/mob/zorgoia64x32.dmi', option, dir = 4) + var/image/I = image('icons/mob/zorgoia64x32.dmi', option, dir = 4) LAZYSET(options, option, I) choice = show_radial_menu(src, src, options, radius = 90) if(!choice || QDELETED(src) || src.incapacitated()) @@ -294,7 +294,7 @@ src.trait_injection_reagents += REAGENT_ID_RAINBOWTOXIN // Funny flashing lights. src.trait_injection_reagents += REAGENT_ID_PARALYSISTOXIN // Paralysis! src.trait_injection_reagents += REAGENT_ID_PAINENZYME // Pain INCREASER - src.trait_injection_reagents += REAGENT_ID_APHRODISIAC // Horni + // src.trait_injection_reagents += REAGENT_ID_APHRODISIAC // Horni // Downstream only var/list/goia_colors = list("#1a00ff", "#6c5bff", "#ff00fe", "#ff0000", "#00d3ff", "#00ff7c", "#00ff35", "#e1ff00", "#ff9f00", "#393939") var/bodycolor = pick(goia_colors) @@ -329,7 +329,7 @@ else plane = ABOVE_MOB_PLANE cut_overlays() - icon = 'modular_chomp/icons/mob/zorgoia64x32.dmi' + icon = 'icons/mob/zorgoia64x32.dmi' vore_capacity = 3 //Heads up, the order of these overlays stacking on top of each other is different from the array order. So goia_overlay[1] is the belly, but rendering on top of everything at the end instead diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm b/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm index 98dfda9e57..2f15a13fb2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm @@ -24,7 +24,7 @@ response_help = "pets" response_disarm = "shoves" response_harm = "smacks" - movement_cooldown = -1 + movement_cooldown = -1 // 2 Downstream harm_intent_damage = 10 melee_damage_lower = 10 melee_damage_upper = 20 @@ -85,7 +85,7 @@ Canis Lupus Greatus, or Great Wolf, is a very large predator not beleived to be native to Sif (because it's a wolf, duh), but it has been never been found anywhere else. Despite their size, they are gentle, unless disturbed.\ The majority of a great white wolf's long life is spent much the same as ordinary wolves. However, great wolves usually do not trouble themselves with small prey like humans, \ usually preferring instead to hunt Saviks and Kururaks, and sometimes, leopardmanders or invasive red dragons. \ - Though usually docile towards humans and other large sapients, neesless to say, these wolves possess great strength and a lethal bite. \ + Though usually docile towards humans and other large sapients, neesless to say, these wolves posesses great strength and a lethal bite. \ a provoked great wolf can be a danger to even the most hardy of explorers due to its speed, crushing bite, and sometimes, it's appetite. \ The great wolves have been hunted to near extinction by poachers due to its extremely valuable hide. They are very rare, as one would expect, and generally cautious around people." value = CATALOGUER_REWARD_HARD @@ -94,9 +94,10 @@ . = ..() if(!riding_datum) riding_datum = new /datum/riding/simple_mob(src) - add_verb(src, /mob/living/simple_mob/proc/animal_mount) - add_verb(src, /mob/living/proc/toggle_rider_reins) - movement_cooldown = -1.5 + add_verb(src,/mob/living/simple_mob/proc/animal_mount) + add_verb(src,/mob/living/proc/toggle_rider_reins) + add_verb(src,/mob/living/simple_mob/proc/pick_color) + movement_cooldown = -1.5 // 1.5 Downstream /mob/living/simple_mob/vore/greatwolf/MouseDrop_T(mob/living/M, mob/living/user) return @@ -129,8 +130,8 @@ B.vore_verb = "slurp" B.contamination_color = "grey" B.contamination_flavor = "Wet" - B.belly_fullscreen_color = "#c47cb4" // CHOMPedit - Belly Fullscreen - B.belly_fullscreen = "anim_belly" // CHOMPedit - Belly Fullscreen + B.belly_fullscreen_color = "#c47cb4" + B.belly_fullscreen = "anim_belly" B.emote_lists[DM_HOLD] = list( "The wolf's idle wandering helps its stomach gently churn around you, slimily squelching against your figure.", @@ -159,7 +160,7 @@ "%pred's %belly lets out a wet squelch as a few rounded shapes appear on its surface for a moment.") B.struggle_messages_inside = list( - "Your squirming seems to please the canine, though it's hard to tell whether or not it's helping get you out or not.", + "Your squirming seems to please the canine, though it's hard to tell wether or not it's helping get you out or not.", "Your struggles only cause %pred's %belly to groan and gurgle softly around you.", "Your movement only causes %pred's %belly to clench down upon you, smothering you briefly in thick gutflesh.", "Your motion causes %pred's %belly to rumble irritably as you sink hands into the thick flesh.", diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf_ch.dm deleted file mode 100644 index a696a56a09..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf_ch.dm +++ /dev/null @@ -1,166 +0,0 @@ -/mob/living/simple_mob/vore/greatwolf - name = "great white wolf" - desc = "A massive white wolf, with piercing green eyes. Much like a dire wolf, but bigger. Passive, until you give it a reason to not be." - catalogue_data = list(/datum/category_item/catalogue/fauna/greatwolf) - tt_desc = "Canis lupus greatus" - icon = 'icons/mob/vore128x64_ch.dmi' - icon_dead = "whitewolf-dead" - icon_living = "whitewolf" - icon_state = "whitewolf" - icon_rest = "whitewolf-rest" - faction = "sif" - has_eye_glow = TRUE - meat_amount = 40 //Big dog, lots of meat - meat_type = /obj/item/reagent_containers/food/snacks/meat - old_x = -48 - old_y = 0 - melee_damage_lower = 20 - melee_damage_upper = 15 - friendly = list("nudges", "sniffs on", "rumbles softly at", "slobberlicks") - default_pixel_x = -48 - pixel_x = -48 - pixel_y = 0 - response_help = "pets" - response_disarm = "shoves" - response_harm = "smacks" - movement_cooldown = 2 - harm_intent_damage = 10 - melee_damage_lower = 10 - melee_damage_upper = 20 - maxHealth = 500 - attacktext = list("chomped") - see_in_dark = 8 - minbodytemp = 0 - ai_holder_type = /datum/ai_holder/simple_mob/retaliate - max_buckled_mobs = 1 - mount_offset_y = 32 - mount_offset_x = -16 - can_buckle = TRUE - buckle_movable = TRUE - buckle_lying = FALSE - - can_be_drop_prey = FALSE //CHOMP Add - -/mob/living/simple_mob/vore/greatwolf - - vore_bump_chance = 25 - vore_digest_chance = 5 - vore_escape_chance = 5 - vore_pounce_chance = 25 - vore_active = 1 - vore_icons = 2 - vore_icons = SA_ICON_LIVING | SA_ICON_REST - vore_capacity = 2 - swallowTime = 50 - vore_ignores_undigestable = TRUE - vore_default_mode = DM_HEAL - vore_pounce_maxhealth = 125 - vore_bump_emote = "tries to snap up" - -/mob/living/simple_mob/vore/greatwolf/black - name = "great black wolf" - desc = "A massive black wolf with a sandy colored underside, and intimidating amber eyes. Much like a dire wolf, but bigger. Passive, until you give it a reason to not be." - icon_dead = "blackwolf-dead" - icon_living = "blackwolf" - icon_state = "blackwolf" - icon_rest = "blackwolf-rest" - -/mob/living/simple_mob/vore/greatwolf/grey - name = "great grey wolf" - desc = "Shouldn't he have a sword or something?" - icon_dead = "sifwolf-dead" - icon_living = "sifwolf" - icon_state = "sifwolf" - icon_rest = "blackwolf-rest" - maxHealth = 900 //boss, with air quotes - harm_intent_damage = 10 - melee_damage_lower = 15 - melee_damage_upper = 25 - -/datum/category_item/catalogue/fauna/greatwolf - name = "Sivian Fauna - Great Wolf" - desc = "Classification: Canis lupus greatus\ -

\ - Canis Lupus Greatus, or Great Wolf, is a very large predator not beleived to be native to Sif (because it's a wolf, duh), but it has been never been found anywhere else. Despite their size, they are gentle, unless disturbed.\ - The majority of a great white wolf's long life is spent much the same as ordinary wolves. However, great wolves usually do not trouble themselves with small prey like humans, \ - usually preferring instead to hunt Saviks and Kururaks, and sometimes, leopardmanders or invasive red dragons. \ - Though usually docile towards humans and other large sapients, neesless to say, these wolves posesses great strength and a lethal bite. \ - a provoked great wolf can be a danger to even the most hardy of explorers due to its speed, crushing bite, and sometimes, it's appetite. \ - The great wolves have been hunted to near extinction by poachers due to its extremely valuable hide. They are very rare, as one would expect, and generally cautious around people." - value = CATALOGUER_REWARD_HARD - -/mob/living/simple_mob/vore/greatwolf/Login() - . = ..() - if(!riding_datum) - riding_datum = new /datum/riding/simple_mob(src) - add_verb(src,/mob/living/simple_mob/proc/animal_mount) //CHOMPEdit TGPanel - add_verb(src,/mob/living/proc/toggle_rider_reins) //CHOMPEdit TGPanel - movement_cooldown = 1.5 - -/mob/living/simple_mob/vore/greatwolf/MouseDrop_T(mob/living/M, mob/living/user) - return - - -/mob/living/simple_mob/vore/greatwolf/attackby(var/obj/item/O, var/mob/user) // Trade food for people! - if(istype(O, /obj/item/reagent_containers/food)) - qdel(O) - playsound(src,'sound/vore/gulp.ogg', rand(10,50), 1) - if(!has_AI())//No autobarf on player control. - return - if(istype(O, /obj/item/reagent_containers/food/snacks/donut) && istype(src, /mob/living/simple_mob/vore/greatwolf/black)) - to_chat(user,span_notice("The huge wolf begrudgingly accepts your offer in exchange for it's catch.")) - release_vore_contents() - else if(prob(2)) //Small chance to get prey out from white doggos - to_chat(user,span_notice("The huge wolf accepts your offer for their catch.")) - release_vore_contents() - return - . = ..() - -/mob/living/simple_mob/vore/greatwolf/load_default_bellies() - . = ..() - var/obj/belly/B = vore_selected - B.name = "stomach" - B.desc = "The moment the wolf gets its jaws around you, it scoops you right up off of the ground, and greedily scarfs you down with a few swift gulps. Your small frame alone is hardly enough to make him look somewhat plump as you slop wetly into that dark, hot chamber, although the dense squish is rather comfortable. The thick, humid air is tinged with the smell of digested meat, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder." - B.vore_sound = "Tauric Swallow" - B.release_sound = "Pred Escape" - B.mode_flags = DM_FLAG_NUMBING | DM_FLAG_THICKBELLY | DM_FLAG_AFFECTWORN - B.fancy_vore = 1 - B.vore_verb = "slurp" - B.contamination_color = "grey" - B.contamination_flavor = "Wet" - - B.emote_lists[DM_HOLD] = list( - "The wolf's idle wandering helps its stomach gently churn around you, slimily squelching against your figure.", - "The lupine predator takes a moment to intentionally clench its gut around you, encapsulating you in a strange, fleshy hug.", - "Some hot, viscous slime oozes down over your form, helping slicken you up during your stay.", - "During a moment of relative silence, you can hear the beast's soft, relaxed breathing as it casually goes about its day.", - "The thick, humid atmosphere within the wolf's hanging belly works in tandem with its steady heartbeat to soothe you.", - "Your surroundings sway from side to side as the wolf wanders about, looking for its next treat.") - - B.emote_lists[DM_DIGEST] = list( - "The wolf huffs in annoyance before clenching those soft wrinkled walls tight against your form, lathering you in digestive enzymes!", - "As the beast wanders about, you're forced to slip and slide around amidst a pool of thick digestive goop!", - "You can barely hear the wolf let out a pleased growl as its stomach eagerly gurgles around its newfound meal!", - "As the thinning air begins to make you feel dizzy, menacing bworps and grumbles fill that dark, constantly shifting organ!", - "The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!", - "The wolf happily wanders around while digesting its meal, slow calculated motions suggesting the beast is still on the hunt.") - - B.struggle_messages_outside = list( - "%pred's %belly wobbles ever so slightly with a squirming meal.", - "%pred's %belly jostles subtly with movement.", - "%pred's %belly briefly swells downward as someone pushes from inside.", - "%pred's %belly sloshes and churns noisily with a trapped victim.", - "%pred's %belly swells in a few places as someone pushes from inside.", - "%pred's %belly sloshes around.", - "%pred's %belly sloshes and sways softly.", - "%pred's %belly lets out a wet squelch as a few rounded shapes appear on its surface for a moment.") - - B.struggle_messages_inside = list( - "Your squirming seems to please the canine, though it's hard to tell wether or not it's helping get you out or not.", - "Your struggles only cause %pred's %belly to groan and gurgle softly around you.", - "Your movement only causes %pred's %belly to clench down upon you, smothering you briefly in thick gutflesh.", - "Your motion causes %pred's %belly to rumble irritably as you sink hands into the thick flesh.", - "You fidget around awkwardly inside of %pred's %belly.", - "You shove against the walls of %pred's %belly, making it briefly swell outward.", - "You jostle %pred's %belly with movement, earning yourself another tight smothering squeeze in the process.", - "You squirm inside of %pred's %belly, making it sway from side to side.") diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/gryphon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/gryphon.dm similarity index 99% rename from modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/gryphon.dm rename to code/modules/mob/living/simple_mob/subtypes/vore/gryphon.dm index 253b4e52de..47cc0bd8ff 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/gryphon.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/gryphon.dm @@ -4,7 +4,7 @@ icon_state = "gryphon" icon_living = "gryphon" - icon = 'modular_chomp/icons/mob/vore64x64_ch.dmi' + icon = 'icons/mob/vore64x64.dmi' vis_height = 64 faction = FACTION_GRYPHON diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/hippo.dm b/code/modules/mob/living/simple_mob/subtypes/vore/hippo.dm index 80ad798cff..b7468e59d2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/hippo.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/hippo.dm @@ -50,7 +50,7 @@ say_list_type = /datum/say_list/hippo ai_holder_type = /datum/ai_holder/simple_mob/retaliate - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE // Activate Noms! /mob/living/simple_mob/vore/hippo //I don't know why it's in a seperate line but everyone does it so i do it diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm b/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm index 86c678421f..72c7c4b5a8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm @@ -35,7 +35,7 @@ say_list_type = /datum/say_list/horse ai_holder_type = /datum/ai_holder/simple_mob/retaliate - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE allow_mind_transfer = TRUE /mob/living/simple_mob/vore/horse/big diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/jelly.dm b/code/modules/mob/living/simple_mob/subtypes/vore/jelly.dm index 330354527a..60f0308b81 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/jelly.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/jelly.dm @@ -28,7 +28,7 @@ say_list_type = /datum/say_list/jelly ai_holder_type = /datum/ai_holder/simple_mob/retaliate/jelly - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE min_oxy = 0 max_oxy = 0 @@ -64,11 +64,9 @@ B.digest_brute = 0.3 B.digest_burn = 0.3 B.escapechance = 10 // You were dumb enough to walk into it or stand still, now good luck escaping. - // CHOMPAdd Start - B.contaminates = 1 + B.contaminates = TRUE B.contamination_flavor = "Slimy" B.contamination_color = "green" - // CHOMPAdd End B.item_digest_mode = IM_HOLD B.belly_fullscreen = "VBOanim_belly1" B.belly_fullscreen_color = "#823232" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm b/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm index 502d477522..7ecdfe1d11 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm @@ -55,7 +55,7 @@ say_list_type = /datum/say_list/lamia ai_holder_type = /datum/ai_holder/simple_mob/passive - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/vore/lamia/update_icon() . = ..() @@ -106,11 +106,9 @@ tail.nonhuman_prey_swallow_time = swallowTime tail.vore_verb = "stuff" tail.belly_sprite_to_affect = "tail" - // CHOMPEdit Start tail.belly_fullscreen = "VBOanim_snakebelly1" tail.belly_fullscreen_color = "#823232" tail.belly_fullscreen_color2 = "#232300" - // CHOMPEdit End // Belly Lines by killerdragn (@kilo.ego on discord) from Rogue Star B.emote_lists[DM_HOLD] = list( @@ -374,3 +372,20 @@ GLOBAL_LIST_INIT(valid_random_lamias, list( speak = list("Sss...","Sss!","Hiss!","HSSSSS") emote_hear = list("hisses","slithers") emote_see = list("shakes her head","coils","stretches","slithers") + +/mob/living/simple_mob/vore/lamia/albino/cave + name = "albino cave lamia" + desc = "Combination snake-human. This one looks ravenous!" + melee_damage_lower = 5 + melee_damage_upper = 5 + vore_upper_transfer_chance = 75 // Since these lamias are on the hunt, you're getting pushed into the tail tum for fussing. + vore_tail_transfer_chance = 10 // And the albino ones are EXTRA greedy! + ai_holder_type = /datum/ai_holder/simple_mob/vore/stalker // Good enough for now. + +/mob/living/simple_mob/vore/lamia/copper/cave + name = "cave lamia" + desc = "Combination snake-human. This one looks hungry!" + melee_damage_lower = 5 + melee_damage_upper = 5 + vore_upper_transfer_chance = 75 + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm index 67e74ae364..9cb35c4ccf 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm @@ -13,17 +13,17 @@ meat_type = /obj/item/reagent_containers/food/snacks/meat old_x = -48 old_y = 0 + vis_height = 92 melee_damage_lower = 10 melee_damage_upper = 25 friendly = list("nudges", "sniffs on", "rumbles softly at", "slobberlicks") default_pixel_x = -48 pixel_x = -48 pixel_y = 0 - vis_height = 92 response_help = "pats" response_disarm = "shoves" response_harm = "bops" - movement_cooldown = -1 + movement_cooldown = -1 // 2 on Downstream maxHealth = 1500 attacktext = list("chomped") see_in_dark = 8 @@ -35,27 +35,23 @@ can_buckle = TRUE buckle_movable = TRUE buckle_lying = FALSE - vore_icons = SA_ICON_LIVING vore_bump_chance = 50 - vore_digest_chance = 0 - vore_escape_chance = 50 vore_pounce_chance = 100 vore_active = 1 - vore_icons = 4 + vore_icons = SA_ICON_LIVING|SA_ICON_REST vore_capacity = 4 swallowTime = 100 vore_default_mode = DM_HEAL vore_pounce_maxhealth = 125 vore_bump_emote = "tries to snap up" + max_tox = 0 // for virgo3b survivability nom_mob = TRUE - can_be_drop_prey = FALSE //CHOMP Add - // CHOMPAdd: :c - pain_sound = canine_pain_sounds + can_be_drop_prey = FALSE + species_sounds = "Canine" // Argue about whether it should have canine or feline later pain_emote_1p = list("yelp", "whine", "bark", "growl") pain_emote_3p = list("yelps", "whines", "barks", "growls") - death_sound = canine_death_sounds /datum/category_item/catalogue/fauna/leopardmander name = "Sivian Fauna - Va'aen Drake" @@ -64,7 +60,7 @@ The Va'aen drake, or Sivian leopardmander, is a very large predator known for its unusual ability to heal people's wounds via saliva, or storing them in one of its multiple stomachs for extended periods of time. \ The majority of the Va'aen drake's long life is spent in isolation, hunting saviks and shantaks in Sif's mountainous regions or roaming the vast tundras of Sif, \ only seeking out other individuals during the summer mating season where they spend several months in courtship, usually only producing a single egg. \ - Though completely docile towards humans and other large sapients, the Va'aen drake possesses great strength and a very potent paralyzing venom; \ + Though completely docile towards humans and other large sapients, the Va'aen drake posesses great strength and a very potent paralyzing venom; \ a provoked Va'aen can be a danger to even the most hardy of explorers due to its surprising speed, crushing bite, and long lasting venom. \ The Va'aen has been hunted to near extinction by poachers due to its secretions' unusual healing properties, and its beautiful hide; encountering one has become very rare." value = CATALOGUER_REWARD_HARD @@ -73,26 +69,33 @@ . = ..() if(!riding_datum) riding_datum = new /datum/riding/simple_mob(src) - add_verb(src, /mob/living/simple_mob/proc/animal_mount) - add_verb(src, /mob/living/proc/toggle_rider_reins) - movement_cooldown = -1 + add_verb(src,/mob/living/simple_mob/proc/animal_mount) + add_verb(src,/mob/living/proc/toggle_rider_reins) + movement_cooldown = -1 // 2 on Downstream + plane_holder.set_vis(VIS_CH_HEALTH_VR, 1) + plane_holder.set_vis(VIS_CH_ID, 1) + plane_holder.set_vis(VIS_CH_STATUS_R, 1) + plane_holder.set_vis(VIS_CH_BACKUP, 1) /mob/living/simple_mob/vore/leopardmander/Initialize(mapload) . = ..() src.adjust_nutrition(src.max_nutrition) /mob/living/simple_mob/vore/leopardmander/load_default_bellies() - . = ..() - var/obj/belly/B = vore_selected + var/obj/belly/B = new /obj/belly(src) + B.affects_vore_sprites = TRUE + B.belly_sprite_to_affect = "stomach" B.name = "stomach" B.desc = "The leopardmander tosses its head back with you firmly clasped in its jaws, and in a few swift moments it finishes swallowing you down into its hot, dark gut. Your weight makes absolutely no impact on its form, the doughy walls giving way beneath you with unnatural softness. The thick, humid air is tinged with an oddly pleasant smell, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder, smothering you in thick hot gutflesh~" B.vore_sound = "Tauric Swallow" B.release_sound = "Pred Escape" - B.mode_flags = DM_FLAG_NUMBING + B.mode_flags = DM_FLAG_NUMBING | DM_FLAG_THICKBELLY | DM_FLAG_TURBOMODE B.fancy_vore = 1 B.vore_verb = "slurp" B.contamination_color = "grey" B.contamination_flavor = "Wet" + B.belly_fullscreen_color = "#c47cb4" + B.belly_fullscreen = "anim_belly" B.emote_lists[DM_HEAL] = list( "The drake's idle movement helps its stomach gently churn around you, slimily squelching against your figure.", "The draconic predator takes a moment to intentionally clench its gut around you, encapsulating you in a strange, fleshy hug.", @@ -109,6 +112,32 @@ "The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!", "The drake happily wanders around while digesting its meal, almost like it is trying to show off the hanging gut you've given it. Not like it made much of a difference on his already borderline obese form anyway~") + B = new /obj/belly(src) + + vore_selected = B + B.name = "maw" + B.desc = "Slrrrrrp... You get snatched up by the Exotic Leopardmander's large tongue, resulting in you getting dragged into the humid, dank interior of the large drake's cavernous mouth!" + //Not going to change the default sounds. Personally I think the non-fancy sounds work good as enterance nom sounds and the fancy ones are better for transfer sounds. -Reo + B.digest_mode = DM_HEAL + B.vore_verb = "slurp" + B.release_verb = "plehs" + B.contaminates = FALSE + B.belly_fullscreen_color = "#c47cb4" + B.belly_fullscreen_color2 = "#C2B4B4" + B.belly_fullscreen_color3 = "#FFCCFF" + B.belly_fullscreen = "VBO_maw5" + B.emote_time = 1 //Short emote time, since they wont spend long here! + B.emote_lists[DM_HOLD] = list( + "The drake's thick tongue presses against your form, smothering you with thick, gooey saliva as it pushes you around in it's maw.", + "The exotic drake lets out a deep rumble as it idly maws over you, shifting you in a warm, slimy embrace as it passively prepares to send you into a deeper embrace." + ) + B.autotransfer_enabled = TRUE + B.autotransferchance = 30 + B.autotransferwait = 5 + B.autotransferlocation = "stomach" + B.escapetime = 1 SECONDS + B.escapechance = 75 + /datum/say_list/leopardmander speak = list("Prurr.", "Rrrhf.", "Rrrrrll.", "Mrrrrph.") emote_hear = list("chuffs", "murrs", "churls", "hisses", "rrrrrls", "yawns that big ol' maw open.") @@ -123,6 +152,7 @@ icon_dead = "leopardmander_blue-dead" icon_living = "leopardmander_blue" icon_state = "leopardmander_blue" + icon_rest = "leopardmander_blue-rest" /mob/living/simple_mob/vore/leopardmander/exotic name = "glass-belly leopardmander" @@ -131,6 +161,7 @@ icon_dead = "leopardmander_exotic-dead" icon_living = "leopardmander_exotic" icon_state = "leopardmander_exotic" + icon_rest = "leopardmander_exotic-rest" glow_toggle = TRUE //Glow! glow_range = 2 @@ -146,20 +177,22 @@ /mob/living/simple_mob/vore/leopardmander/exotic/Initialize(mapload) . = ..() - add_verb(src, /mob/living/simple_mob/vore/leopardmander/exotic/proc/toggle_glow) + add_verb(src,/mob/living/simple_mob/vore/leopardmander/exotic/proc/toggle_glow) /mob/living/simple_mob/vore/leopardmander/exotic/load_default_bellies() - . = ..() - var/obj/belly/B = vore_selected + var/obj/belly/B = new /obj/belly(src) B.name = "stomach" B.desc = "The exotic leopardmander tosses its head back with you firmly clasped in its jaws, and in a few swift moments it finishes swallowing you down into its hot, brightly glowing gut. Your weight makes absolutely no impact on its form, the doughy walls giving way beneath you, with their unnatural softness. The thick, humid air is tinged with an oddly pleasant smell, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder, smothering you in thick hot gutflesh~ You can only really sort of see outside that thick-walled gut." B.vore_sound = "Tauric Swallow" B.release_sound = "Pred Escape" - B.mode_flags = DM_FLAG_NUMBING + B.mode_flags = DM_FLAG_NUMBING | DM_FLAG_THICKBELLY | DM_FLAG_TURBOMODE B.fancy_vore = 1 B.vore_verb = "slurp" B.contamination_color = "pink" B.contamination_flavor = "Wet" + B.belly_fullscreen_color = "#df3dbc" + B.belly_fullscreen_alpha = 240 + B.belly_fullscreen = "anim_belly" B.emote_lists[DM_HEAL] = list( "The drake's idle movement helps its stomach gently churn around you, slimily squelching against your figure.", "The draconic predator takes a moment to intentionally clench its gut around you, encapsulating you in a strange, fleshy hug.", @@ -175,6 +208,32 @@ "As the thinning air begins to make you feel dizzy, menacing bworps and grumbles fill that dark, constantly shifting organ!", "The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!", "The drake happily wanders around while digesting its meal, almost like it is trying to show off the hanging gut you've given it. Not like it made much of a difference on his already borderline obese form anyway~") + B.transferchance = 50 + B.transferlocation = "maw" + + B = new /obj/belly(src) + vore_selected = B + + B.name = "maw" + B.desc = "Slrrrrrp... You get snatched up by the Exotic Leopardmander's large tongue, resulting in you getting dragged into the humid, dank interior of the large drake's cavernous mouth!" + //Not going to change the default sounds. Personally I think the non-fancy sounds work good as enterance nom sounds and the fancy ones are better for transfer sounds. -Reo + B.vore_verb = "slurp" + B.release_verb = "plehs" + B.contaminates = FALSE + B.belly_fullscreen_color = "#c47cb4" + B.belly_fullscreen_color2 = "#C2B4B4" + B.belly_fullscreen_color3 = "#8D60CE" + B.belly_fullscreen_color4 = "#B593F9" + B.belly_fullscreen = "VBO_maw5" + B.emote_time = 1 //Short emote time, since they wont spend long here! + B.emote_lists[DM_HOLD] = list( + "The drake's thick tongue presses against your form, smothering you with thick, gooey saliva as it pushes you around in it's maw.", + "The exotic drake lets out a deep rumble as it idly maws over you, shifting you in a warm, slimy embrace as it passively prepares to send you into a deeper embrace." + ) + B.autotransferwait = 5 + B.autotransferlocation = "stomach" + B.escapetime = 1 SECONDS + B.escapechance = 75 /obj/random/mob/leopardmander/item_to_spawn() //Random map spawner return pick(prob(89);/mob/living/simple_mob/vore/leopardmander, diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm deleted file mode 100644 index 64ca73e840..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm +++ /dev/null @@ -1,243 +0,0 @@ -/mob/living/simple_mob/vore/leopardmander - name = "leopardmander" - desc = "A huge salamander-like drake. They are best known for their rarity, their voracity, their very potent paralyzing venom, and their healing stomach. This one is white." - catalogue_data = list(/datum/category_item/catalogue/fauna/leopardmander) - tt_desc = "S Draconis uncia" - icon = 'modular_chomp/icons/mob/vore128x64_ch.dmi' - icon_dead = "leopardmander-dead" - icon_living = "leopardmander" - icon_state = "leopardmander" - icon_rest = "leopardmander-rest" - faction = "neutral" - meat_amount = 40 //I mean... - meat_type = /obj/item/reagent_containers/food/snacks/meat - old_x = -48 - old_y = 0 - vis_height = 92 - melee_damage_lower = 10 - melee_damage_upper = 25 - friendly = list("nudges", "sniffs on", "rumbles softly at", "slobberlicks") - default_pixel_x = -48 - pixel_x = -48 - pixel_y = 0 - response_help = "pats" - response_disarm = "shoves" - response_harm = "bops" - movement_cooldown = 2 - maxHealth = 1500 - attacktext = list("chomped") - see_in_dark = 8 - minbodytemp = 0 - ai_holder_type = /datum/ai_holder/simple_mob/healbelly - max_buckled_mobs = 1 - mount_offset_y = 32 - mount_offset_x = -16 - can_buckle = TRUE - buckle_movable = TRUE - buckle_lying = FALSE - vore_icons = SA_ICON_LIVING - vore_bump_chance = 50 - //vore_digest_chance = 0 // Im setting these two in the individual bellies, I dont know how they interact with multiple - //vore_escape_chance = 50 // bellies so im just commenting them out. -Reo - vore_pounce_chance = 100 - vore_active = 1 - vore_icons = 5 - vore_capacity = 4 - swallowTime = 100 - vore_default_mode = DM_HEAL - vore_pounce_maxhealth = 125 - vore_bump_emote = "tries to snap up" - - can_be_drop_prey = FALSE //CHOMP Add - // CHOMPAdd: :c - species_sounds = "Canine" // Argue about whether it should have canine or feline later - pain_emote_1p = list("yelp", "whine", "bark", "growl") - pain_emote_3p = list("yelps", "whines", "barks", "growls") - // CHOMPAdd End - -/datum/category_item/catalogue/fauna/leopardmander - name = "Sivian Fauna - Va'aen Drake" - desc = "Classification: S Draconis uncia\ -

\ - The Va'aen drake, or Sivian leopardmander, is a very large predator known for its unusual ability to heal people's wounds via saliva, or storing them in one of its multiple stomachs for extended periods of time. \ - The majority of the Va'aen drake's long life is spent in isolation, hunting saviks and shantaks in Sif's mountainous regions or roaming the vast tundras of Sif, \ - only seeking out other individuals during the summer mating season where they spend several months in courtship, usually only producing a single egg. \ - Though completely docile towards humans and other large sapients, the Va'aen drake posesses great strength and a very potent paralyzing venom; \ - a provoked Va'aen can be a danger to even the most hardy of explorers due to its surprising speed, crushing bite, and long lasting venom. \ - The Va'aen has been hunted to near extinction by poachers due to its secretions' unusual healing properties, and its beautiful hide; encountering one has become very rare." - value = CATALOGUER_REWARD_HARD - -/mob/living/simple_mob/vore/leopardmander/Login() - . = ..() - if(!riding_datum) - riding_datum = new /datum/riding/simple_mob(src) - add_verb(src,/mob/living/simple_mob/proc/animal_mount) //CHOMPEdit TGPanel - add_verb(src,/mob/living/proc/toggle_rider_reins) //CHOMPEdit TGPanel - movement_cooldown = 2 - plane_holder.set_vis(VIS_CH_HEALTH_VR, 1) - plane_holder.set_vis(VIS_CH_ID, 1) - plane_holder.set_vis(VIS_CH_STATUS_R, 1) - plane_holder.set_vis(VIS_CH_BACKUP, 1) //Makes sense for player Leppy's to be able to see health. - -/mob/living/simple_mob/vore/leopardmander/Initialize(mapload) - . = ..() - src.adjust_nutrition(src.max_nutrition) - -/mob/living/simple_mob/vore/leopardmander/load_default_bellies() - var/obj/belly/B = new /obj/belly(src) - B.affects_vore_sprites = TRUE - B.belly_sprite_to_affect = "stomach" - B.name = "stomach" - B.desc = "The leopardmander tosses its head back with you firmly clasped in its jaws, and in a few swift moments it finishes swallowing you down into its hot, dark gut. Your weight makes absolutely no impact on its form, the doughy walls giving way beneath you with unnatural softness. The thick, humid air is tinged with an oddly pleasant smell, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder, smothering you in thick hot gutflesh~" - B.vore_sound = "Tauric Swallow" - B.release_sound = "Pred Escape" - B.mode_flags = DM_FLAG_NUMBING | DM_FLAG_THICKBELLY | DM_FLAG_TURBOMODE - B.fancy_vore = 1 - B.vore_verb = "slurp" - B.contamination_color = "grey" - B.contamination_flavor = "Wet" - B.belly_fullscreen_color = "#c47cb4" // CHOMPedit - Belly Fullscreen - B.belly_fullscreen = "anim_belly" // CHOMPedit - Belly Fullscreen - B.emote_lists[DM_HEAL] = list( - "The drake's idle movement helps its stomach gently churn around you, slimily squelching against your figure.", - "The draconic predator takes a moment to intentionally clench its gut around you, encapsulating you in a strange, fleshy hug.", - "Some hot, viscous slime oozes down over your form, helping slicken you up, and heal your injuries during your stay.", - "During a moment of relative silence, you can hear the beast's soft, relaxed breathing as it casually goes about its day.", - "The thick, humid atmosphere within the drake's thick hanging belly works in tandem with its steady, metronome-like heartbeat to soothe you.", - "Your surroundings sway from side to side as the drake wanders about, your form sinking bodily into the doughy, soft gutflesh.") - - B.emote_lists[DM_DIGEST] = list( - "The drake growls in annoyance before clenching those wrinkled walls tight against your form, grinding away at you!", - "As the beast wanders about, you're forced to slip and slide around amidst a pool of thick digestive goop, sinking briefly into the thick, heavy walls!", - "You can barely hear the drake let out a pleased rumble as its stomach eagerly gurgles around its newfound meal!", - "As the thinning air begins to make you feel dizzy, menacing bworps and grumbles fill that dark, constantly shifting organ!", - "The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!", - "The drake happily wanders around while digesting its meal, almost like it is trying to show off the hanging gut you've given it. Not like it made much of a difference on his already borderline obese form anyway~") - - B = new /obj/belly(src) - - vore_selected = B - B.name = "maw" - B.desc = "Slrrrrrp... You get snatched up by the Exotic Leopardmander's large tongue, resulting in you getting dragged into the humid, dank interior of the large drake's cavernous mouth!" - //Not going to change the default sounds. Personally I think the non-fancy sounds work good as enterance nom sounds and the fancy ones are better for transfer sounds. -Reo - B.digest_mode = DM_HEAL - B.vore_verb = "slurp" - B.release_verb = "plehs" - B.contaminates = FALSE - B.belly_fullscreen_color = "#c47cb4" - B.belly_fullscreen_color2 = "#C2B4B4" - B.belly_fullscreen_color3 = "#FFCCFF" - B.belly_fullscreen = "VBO_maw5" - B.emote_time = 1 //Short emote time, since they wont spend long here! - B.emote_lists[DM_HOLD] = list( - "The drake's thick tongue presses against your form, smothering you with thick, gooey saliva as it pushes you around in it's maw.", - "The exotic drake lets out a deep rumble as it idly maws over you, shifting you in a warm, slimy embrace as it passively prepares to send you into a deeper embrace." - ) - B.autotransfer_enabled = TRUE - B.autotransferchance = 30 - B.autotransferwait = 5 - B.autotransferlocation = "stomach" - B.escapetime = 1 SECONDS - B.escapechance = 75 - -/datum/say_list/leopardmander - speak = list("Prurr.", "Rrrhf.", "Rrrrrll.", "Mrrrrph.") - emote_hear = list("chuffs", "murrs", "churls", "hisses", "rrrrrls", "yawns that big ol' maw open.") - emote_see = list("licks their chops", "stretches", "yawns", "whisker-twitches") - say_maybe_target = list("Rrrrh?") - say_got_target = list("Rurrr!", "ROAR!", "RAH!") - -/mob/living/simple_mob/vore/leopardmander/blue - name = "blue leopardmander" - desc = "A huge, pale blue, salamander-like drake. They are best known for their rarity, their voracity, their very potent paralyzing, yet somehow very beneficial venom, and their healing stomach. This one seems to have had a rare genetic mutation, making its skin appear blue." - tt_desc = "Draconis Va'aen" - icon_dead = "leopardmander_blue-dead" - icon_living = "leopardmander_blue" - icon_state = "leopardmander_blue" - icon_rest = "leopardmander_blue-rest" - -/mob/living/simple_mob/vore/leopardmander/exotic - name = "glass-belly leopardmander" - desc = "A huge salamander-like drake. They are best known for their rarity, their voracity, their very potent paralyzing venom, and their healing stomach. This one seems to have had a rare genetic mutation, making its entire underside somewhat translucent! A dazzling pink glow comes from within its soft, squishy underside." - tt_desc = "Draconis Va'essa Lucent" - icon_dead = "leopardmander_exotic-dead" - icon_living = "leopardmander_exotic" - icon_state = "leopardmander_exotic" - icon_rest = "leopardmander_exotic-rest" - - glow_toggle = TRUE //Glow! - glow_range = 2 - glow_color = "#FF006E" - glow_intensity = 1.5 - -/mob/living/simple_mob/vore/leopardmander/exotic/proc/toggle_glow() - set name = "Toggle Glow" - set desc = "Switch between glowing and not glowing." - set category = "Abilities.Leopardmander" - - glow_toggle = !glow_toggle - -/mob/living/simple_mob/vore/leopardmander/exotic/Initialize(mapload) - . = ..() - add_verb(src,/mob/living/simple_mob/vore/leopardmander/exotic/proc/toggle_glow) //CHOMPEdit TGPanel - -/mob/living/simple_mob/vore/leopardmander/exotic/load_default_bellies() - var/obj/belly/B = new /obj/belly(src) - B.name = "stomach" - B.desc = "The exotic leopardmander tosses its head back with you firmly clasped in its jaws, and in a few swift moments it finishes swallowing you down into its hot, brightly glowing gut. Your weight makes absolutely no impact on its form, the doughy walls giving way beneath you, with their unnatural softness. The thick, humid air is tinged with an oddly pleasant smell, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder, smothering you in thick hot gutflesh~ You can only really sort of see outside that thick-walled gut." - B.vore_sound = "Tauric Swallow" - B.release_sound = "Pred Escape" - B.mode_flags = DM_FLAG_NUMBING | DM_FLAG_THICKBELLY | DM_FLAG_TURBOMODE - B.fancy_vore = 1 - B.vore_verb = "slurp" - B.contamination_color = "pink" - B.contamination_flavor = "Wet" - B.belly_fullscreen_color = "#df3dbc" // CHOMPedit - Belly Fullscreen - B.belly_fullscreen_alpha = 240 // CHOMPedit - Belly transparency on the transparent bellied drake - B.belly_fullscreen = "anim_belly" // CHOMPedit - Belly Fullscreen - B.emote_lists[DM_HEAL] = list( - "The drake's idle movement helps its stomach gently churn around you, slimily squelching against your figure.", - "The draconic predator takes a moment to intentionally clench its gut around you, encapsulating you in a strange, fleshy hug.", - "Some hot, viscous slime oozes down over your form, helping slicken you up, and heal your injuries during your stay.", - "During a moment of relative silence, you can hear the beast's soft, relaxed breathing as it casually goes about its day.", - "The thick, humid atmosphere within the drake's thick hanging belly works in tandem with its steady, metronome-like heartbeat to soothe you.", - "Your surroundings sway from side to side as the drake wanders about, your form sinking bodily into the doughy, soft gutflesh.") - - B.emote_lists[DM_DIGEST] = list( - "The drake growls in annoyance before clenching those wrinkled walls tight against your form, grinding away at you!", - "As the beast wanders about, you're forced to slip and slide around amidst a pool of thick digestive goop, sinking briefly into the thick, heavy walls!", - "You can barely hear the drake let out a pleased rumble as its stomach eagerly gurgles around its newfound meal!", - "As the thinning air begins to make you feel dizzy, menacing bworps and grumbles fill that dark, constantly shifting organ!", - "The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!", - "The drake happily wanders around while digesting its meal, almost like it is trying to show off the hanging gut you've given it. Not like it made much of a difference on his already borderline obese form anyway~") - B.transferchance = 50 - B.transferlocation = "maw" - - B = new /obj/belly(src) - vore_selected = B - - B.name = "maw" - B.desc = "Slrrrrrp... You get snatched up by the Exotic Leopardmander's large tongue, resulting in you getting dragged into the humid, dank interior of the large drake's cavernous mouth!" - //Not going to change the default sounds. Personally I think the non-fancy sounds work good as enterance nom sounds and the fancy ones are better for transfer sounds. -Reo - B.vore_verb = "slurp" - B.release_verb = "plehs" - B.contaminates = FALSE - B.belly_fullscreen_color = "#c47cb4" - B.belly_fullscreen_color2 = "#C2B4B4" - B.belly_fullscreen_color3 = "#8D60CE" - B.belly_fullscreen_color4 = "#B593F9" - B.belly_fullscreen = "VBO_maw5" - B.emote_time = 1 //Short emote time, since they wont spend long here! - B.emote_lists[DM_HOLD] = list( - "The drake's thick tongue presses against your form, smothering you with thick, gooey saliva as it pushes you around in it's maw.", - "The exotic drake lets out a deep rumble as it idly maws over you, shifting you in a warm, slimy embrace as it passively prepares to send you into a deeper embrace." - ) - B.autotransferwait = 5 - B.autotransferlocation = "stomach" - B.escapetime = 1 SECONDS - B.escapechance = 75 - -/obj/random/mob/leopardmander/item_to_spawn() //Random map spawner - return pick(prob(89);/mob/living/simple_mob/vore/leopardmander, - prob(10);/mob/living/simple_mob/vore/leopardmander/blue, - prob(1);/mob/living/simple_mob/vore/leopardmander/exotic) diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/lion.dm b/code/modules/mob/living/simple_mob/subtypes/vore/lion.dm similarity index 98% rename from modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/lion.dm rename to code/modules/mob/living/simple_mob/subtypes/vore/lion.dm index 5e8969ef53..1c310d623e 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/lion.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/lion.dm @@ -13,7 +13,7 @@ icon_living = "lion" icon_dead = "lion-dead" icon_rest = "lion_rest" - icon = 'modular_chomp/icons/mob/vore64x32_ch.dmi' + icon = 'icons/mob/vore64x32.dmi' maxHealth = 200 health = 200 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/lizardman.dm b/code/modules/mob/living/simple_mob/subtypes/vore/lizardman.dm index 27abfcb267..182ca00a14 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/lizardman.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/lizardman.dm @@ -3,7 +3,7 @@ desc = "That is one buff, angry lizard." tt_desc = "E Anolis cuvieri muscular" - icon = 'modular_chomp/icons/mob/vore32x64_ch.dmi' + icon = 'icons/mob/vore32x64.dmi' icon_state = "lizardman" icon_living = "lizardman" icon_dead = "lizardman-dead" @@ -33,8 +33,8 @@ say_list_type = /datum/say_list/lizardman ai_holder_type = /datum/ai_holder/simple_mob/melee - can_be_drop_prey = FALSE //CHOMP Add - allow_mind_transfer = TRUE //CHOMPAdd + can_be_drop_prey = FALSE + allow_mind_transfer = TRUE /datum/say_list/lizardman diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm b/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm index c50a9d1b0f..7e00b0401a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm @@ -12,7 +12,7 @@ months at a time - the main reason that they prey on humanoids to begin with. They reproduce asexually \ by splitting their mass, the young growing to adulthood within a few years time.\
\ - Mimics have no concerns beyond surviving and acquiring food." //CHOMPedit + Mimics have no concerns beyond surviving and acquiring food." value = CATALOGUER_REWARD_HARD /obj/structure/closet/crate/mimic @@ -20,7 +20,7 @@ desc = "A rectangular steel crate. This one looks particularly unstable." var/mimic_chance = 30 var/mimic_active = TRUE - var/nest = null //CHOMPAdd + var/nest = null /obj/structure/closet/crate/mimic/open() if(src.opened) @@ -28,11 +28,9 @@ if(!src.can_open()) return 0 - //CHOMPAdd Start if(istype(nest, /obj/structure/mob_spawner)) var/obj/structure/mob_spawner/S = nest S.get_used_report(src) - //CHOMPAdd End if(mimic_active) mimic_active = FALSE @@ -43,7 +41,7 @@ new_mimic.real_crate = src new_mimic.name = name new_mimic.desc = desc - //new_mimic.icon = icon CHOMPEdit + //new_mimic.icon = icon new_mimic.icon_state = "open" new_mimic.icon_living = "open" else @@ -71,6 +69,9 @@ /obj/structure/closet/crate/mimic/guaranteed mimic_chance = 100 +/obj/structure/closet/crate/mimic/guaranteed/chest + icon = 'icons/obj/closets/chest.dmi' + /obj/structure/closet/crate/mimic/dangerous mimic_chance = 70 @@ -81,11 +82,9 @@ name = "crate" desc = "A rectangular steel crate." - //CHOMPEdit Start icon_state = "open" icon_living = "open" - icon = 'modular_chomp/icons/mob/animal_ch.dmi' - // CHOMPEdit End + icon = 'icons/mob/mimic.dmi' faction = FACTION_MIMIC @@ -128,7 +127,7 @@ swallowTime = 3 SECONDS vore_capacity = 1 vore_default_mode = DM_DIGEST - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /datum/ai_holder/mimic wander = FALSE @@ -152,3 +151,357 @@ new/obj/structure/closet/crate(loc) real_crate = null qdel(src) + +/obj/structure/closet/crate/mimic/airlock + name = "Dusty Airlock" + desc = "It opens and closes. Though it appears it has been a while since it opened." + icon = 'icons/mob/mimic.dmi' + icon_state = "amimic" + mimic_chance = 30 + anchored = 1 //You will not be able to push back the airlock mimic + density = 1 + opacity = 1 + +/obj/structure/closet/crate/mimic/airlock/open() + if(src.opened) + return 0 + if(!src.can_open()) + return 0 + + if(mimic_active) + mimic_active = FALSE + if(prob(mimic_chance)) + var/mob/living/simple_mob/vore/aggressive/mimic/airlock/new_mimic = new(loc, src) + visible_message(span_bolddanger("The [new_mimic] suddenly growls as it turns out to be a mimic!")) //Controls the vars of the mimic that spawns + forceMove(new_mimic) + new_mimic.real_crate = src + new_mimic.name = name + new_mimic.desc = desc + new_mimic.icon_state = "amimicopen" + new_mimic.icon_living = "amimicopen" + else + qdel(src.loc) + new/obj/machinery/door/airlock/maintenance/common (src.loc) //Places the Airlock + qdel(src)//Deletes the "mimic" + return ..() + else + return ..() + +/obj/structure/closet/crate/mimic/airlock/ex_act(severity) //Stores Mimic Contents for later + for(var/obj/O in src.contents) + qdel(O) + qdel(src) + return + +/obj/structure/closet/crate/mimic/airlock/damage(var/damage) + if(contents.len) + visible_message(span_bolddanger("The [src] let's out an enraged screach!")) + for(var/obj/O in src.contents) + qdel(O) + ..() + +/obj/structure/closet/crate/mimic/airlock/safe + mimic_chance = 0 + +/obj/structure/closet/crate/mimic/airlock/guaranteed + mimic_chance = 100 + +/obj/structure/closet/crate/mimic/airlock/dangerous + mimic_chance = 70 + +/obj/structure/closet/crate/mimic/airlock/cointoss + mimic_chance = 50 + +/mob/living/simple_mob/vore/aggressive/mimic/airlock + name = "Maintnence Access" + desc = "It opens and closes." + icon_state = "amimicopen" + icon_living = "amimicopen" + + maxHealth = 50 + health = 50 + movement_cooldown = 10 + + melee_damage_lower = 8 + melee_damage_upper = 8 + attack_armor_pen = 0 + + armor = list( + "melee" = 10, + "bullet" = 10, + "laser" = 10, + "energy" = 10, + "bomb" = 10, + "bio" = 100, + "rad" = 100) //Its an airlock. + +/mob/living/simple_mob/vore/aggressive/mimic/airlock/will_show_tooltip() + return FALSE + +/mob/living/simple_mob/vore/aggressive/mimic/airlock/death() + new/obj/machinery/door/airlock/maintenance/common (src.loc) + real_crate = null + qdel(src) + + +//Less Terrifying Closet Mimic +/obj/structure/closet/crate/mimic/closet + name = "old closet" + desc = "It's a basic storage unit. It seems awfully rickety." + icon = 'icons/mob/mimic.dmi' + icon_state = "cmimic" + mimic_chance = 30 + mimic_active = TRUE + +/obj/structure/closet/crate/mimic/closet/update_icon() + if(opened) + icon_state = "copen" + else + icon_state = "cmimic" + +/obj/structure/closet/crate/mimic/closet/open() + if(src.opened) + return 0 + if(!src.can_open()) + return 0 + + if(mimic_active) + mimic_active = FALSE + if(prob(mimic_chance)) + var/mob/living/simple_mob/vore/aggressive/mimic/closet/new_mimic = new(loc, src) + visible_message(span_bolddanger("The [new_mimic] suddenly growls as it turns out to be a mimic!")) //Controls the mimic that spawns + forceMove(new_mimic) + new_mimic.real_crate = src + new_mimic.name = name + new_mimic.desc = desc + new_mimic.icon_state = "cmimicopen" + new_mimic.icon_living = "cmimicopen" + else + return ..() + else + return ..() + +/obj/structure/closet/crate/mimic/closet/ex_act(severity) //Stores Mimic Contents for later + for(var/obj/O in src.contents) + qdel(O) + qdel(src) + return + +/obj/structure/closet/crate/mimic/closet/damage(var/damage) + if(contents.len) + visible_message(span_bolddanger("The [src] makes out a crunchy noise as its contents are destroyed!")) + for(var/obj/O in src.contents) + qdel(O) + ..() + +/obj/structure/closet/crate/mimic/closet/safe + mimic_chance = 0 + mimic_active = FALSE + +/obj/structure/closet/crate/mimic/closet/guaranteed + mimic_chance = 100 + +/obj/structure/closet/crate/mimic/closet/dangerous + mimic_chance = 70 + +/obj/structure/closet/crate/mimic/closet/cointoss + mimic_chance = 50 + +/mob/living/simple_mob/vore/aggressive/mimic/closet + name = "old closet" + desc = "It's a basic storage unit. It seems awfully rickety." + icon_state = "cmimicopen" + icon_living = "cmimicopen" + + maxHealth = 50 + health = 50 + movement_cooldown = 7 + + melee_damage_lower = 8 + melee_damage_upper = 8 + attack_armor_pen = 25 // NOM NOM + + armor = list( + "melee" = 10, + "bullet" = 20, + "laser" = 20, + "energy" = 20, + "bomb" = 20, + "bio" = 100, + "rad" = 100) + +/mob/living/simple_mob/vore/aggressive/mimic/closet/will_show_tooltip() + return FALSE + +/mob/living/simple_mob/vore/aggressive/mimic/closet/death() + ..() + if(real_crate) + real_crate.forceMove(loc) + real_crate = null + qdel(src) + +//Floor Mimics... Because mimics you have to interact with to activate was not enough... + +/obj/effect/floormimic //As Floor Mimics are triggered by bumps rather than click interaction... They are effects rather than structures + name = "loose wooden floor" + desc = "The boards here look rather loose." + density = 0 + anchored = 1 + icon = 'icons/mob/mimic.dmi' + icon_state = "wmimic" + var/mimic_chance = 30 + var/mimic_active = TRUE + var/mimic_type = /mob/living/simple_mob/vore/aggressive/mimic/floor + +/obj/effect/floormimic/Crossed(atom/movable/AM) + . = ..() + tryTrigger(AM) + +/obj/effect/floormimic/Bumped(atom/movable/AM) + . = ..() + tryTrigger(AM) + +/obj/effect/floormimic/proc/tryTrigger(atom/movable/victim) + if(!isliving(victim)) + return + var/mob/living/L = victim + if(L.hovering) + return + awaken(L) + +/obj/effect/floormimic/proc/awaken(mob/living/L) + if(!mimic_active) + qdel(src) + return + mimic_active = FALSE + if(!prob(mimic_chance)) + qdel(src) + return + var/mob/living/simple_mob/vore/aggressive/mimic/floor/new_mimic = new mimic_type(drop_location()) + visible_message(span_boldwarning("The [new_mimic] suddenly growls beneath you as it turns out to be a mimic!")) + qdel(src) + +/obj/effect/floormimic/attackby(obj/item/I, mob/living/L) + if(mimic_active) + awaken(L) + else + return ..() + +/obj/effect/floormimic/ex_act(severity) + qdel(src) + +/obj/effect/floormimic/safe + mimic_chance = 0 + +/obj/effect/floormimic/guaranteed + mimic_chance = 100 + +/obj/effect/floormimic/dangerous + mimic_chance = 70 + +/obj/effect/floormimic/cointoss + mimic_chance = 50 + +/mob/living/simple_mob/vore/aggressive/mimic/floor + name = "loose wooden floor" + desc = "The boards here look rather loose." + icon_state = "wmimicopen" + icon_living = "wmimicopen" + + faction = "mimic" + + maxHealth = 100 + health = 100 + movement_cooldown = 5 + + response_help = "touches" + response_disarm = "pushes" + response_harm = "hits" + + melee_damage_lower = 5 + melee_damage_upper = 5 + base_attack_cooldown = 5 + +/mob/living/simple_mob/vore/aggressive/mimic/floor/death() + qdel(src) + +/obj/effect/floormimic/tile + name = "loose floor tiles" + desc = "The tiles here look rather loose." + density = FALSE + anchored = TRUE + icon_state = "tmimic" + mimic_type = /mob/living/simple_mob/vore/aggressive/mimic/floor/tile + +/obj/effect/floormimic/tile/safe + mimic_chance = 0 + +/obj/effect/floormimic/tile/guaranteed + mimic_chance = 100 + +/obj/effect/floormimic/tile/dangerous + mimic_chance = 70 + +/obj/effect/floormimic/tile/cointoss + mimic_chance = 50 + +/mob/living/simple_mob/vore/aggressive/mimic/floor/tile + name = "loose floor tiles" + desc = "The tiles here look rather loose." + icon_state = "tmimicopen" + icon_living = "tmimicopen" + + faction = "mimic" + + maxHealth = 125 + health = 125 + movement_cooldown = 7 + + response_help = "touches" + response_disarm = "pushes" + response_harm = "hits" + + melee_damage_lower = 15 + melee_damage_upper = 15 + base_attack_cooldown = 10 + +/obj/effect/floormimic/plating + name = "loose plating" + desc = "The plating here looks rather loose." + density = FALSE + anchored = TRUE + icon_state = "pmimic" + mimic_type = /mob/living/simple_mob/vore/aggressive/mimic/floor/plating + +/obj/effect/floormimic/plating/safe + mimic_chance = 0 + +/obj/effect/floormimic/plating/guaranteed + mimic_chance = 100 + +/obj/effect/floormimic/plating/dangerous + mimic_chance = 70 + +/obj/effect/floormimic/plating/cointoss + mimic_chance = 50 + +/mob/living/simple_mob/vore/aggressive/mimic/floor/plating + name = "loose plating" + desc = "The plating here look rather loose." + icon_state = "pmimicopen" + icon_living = "pmimicopen" + + faction = "mimic" + + maxHealth = 150 + health = 150 + movement_cooldown = 7 + + response_help = "touches" + response_disarm = "pushes" + response_harm = "hits" + + melee_damage_lower = 15 + melee_damage_upper = 15 + base_attack_cooldown = 10 + attack_armor_pen = 50 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/mimic_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/mimic_ch.dm deleted file mode 100644 index 20ecb89476..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/vore/mimic_ch.dm +++ /dev/null @@ -1,353 +0,0 @@ -/obj/structure/closet/crate/mimic/airlock - name = "Dusty Airlock" - desc = "It opens and closes. Though it appears it has been a while since it opened." - icon = 'modular_chomp/icons/mob/animal_ch.dmi' - icon_state = "amimic" - mimic_chance = 30 - anchored = 1 //You will not be able to push back the airlock mimic - density = 1 - opacity = 1 - -/obj/structure/closet/crate/mimic/airlock/open() - if(src.opened) - return 0 - if(!src.can_open()) - return 0 - - if(mimic_active) - mimic_active = FALSE - if(prob(mimic_chance)) - var/mob/living/simple_mob/vore/aggressive/mimic/airlock/new_mimic = new(loc, src) - visible_message(span_bolddanger("The [new_mimic] suddenly growls as it turns out to be a mimic!")) //Controls the vars of the mimic that spawns - forceMove(new_mimic) - new_mimic.real_crate = src - new_mimic.name = name - new_mimic.desc = desc - new_mimic.icon_state = "amimicopen" - new_mimic.icon_living = "amimicopen" - else - qdel(src.loc) - new/obj/machinery/door/airlock/maintenance/common (src.loc) //Places the Airlock - qdel(src)//Deletes the "mimic" - return ..() - else - return ..() - -/obj/structure/closet/crate/mimic/airlock/ex_act(severity) //Stores Mimic Contents for later - for(var/obj/O in src.contents) - qdel(O) - qdel(src) - return - -/obj/structure/closet/crate/mimic/airlock/damage(var/damage) - if(contents.len) - visible_message(span_bolddanger("The [src] let's out an enraged screach!")) - for(var/obj/O in src.contents) - qdel(O) - ..() - -/obj/structure/closet/crate/mimic/airlock/safe - mimic_chance = 0 - -/obj/structure/closet/crate/mimic/airlock/guaranteed - mimic_chance = 100 - -/obj/structure/closet/crate/mimic/airlock/dangerous - mimic_chance = 70 - -/obj/structure/closet/crate/mimic/airlock/cointoss - mimic_chance = 50 - -/mob/living/simple_mob/vore/aggressive/mimic/airlock - name = "Maintnence Access" - desc = "It opens and closes." - icon_state = "amimicopen" - icon_living = "amimicopen" - - maxHealth = 50 - health = 50 - movement_cooldown = 10 - - melee_damage_lower = 8 - melee_damage_upper = 8 - attack_armor_pen = 0 - - armor = list( - "melee" = 10, - "bullet" = 10, - "laser" = 10, - "energy" = 10, - "bomb" = 10, - "bio" = 100, - "rad" = 100) //Its an airlock. - -/mob/living/simple_mob/vore/aggressive/mimic/airlock/will_show_tooltip() - return FALSE - -/mob/living/simple_mob/vore/aggressive/mimic/airlock/death() - new/obj/machinery/door/airlock/maintenance/common (src.loc) - real_crate = null - qdel(src) - - -//Less Terrifying Closet Mimic -/obj/structure/closet/crate/mimic/closet - name = "old closet" - desc = "It's a basic storage unit. It seems awfully rickety." - icon = 'modular_chomp/icons/mob/animal_ch.dmi' - icon_state = "cmimic" - mimic_chance = 30 - mimic_active = TRUE - -/obj/structure/closet/crate/mimic/closet/update_icon() - if(opened) - icon_state = "copen" - else - icon_state = "cmimic" - -/obj/structure/closet/crate/mimic/closet/open() - if(src.opened) - return 0 - if(!src.can_open()) - return 0 - - if(mimic_active) - mimic_active = FALSE - if(prob(mimic_chance)) - var/mob/living/simple_mob/vore/aggressive/mimic/closet/new_mimic = new(loc, src) - visible_message(span_bolddanger("The [new_mimic] suddenly growls as it turns out to be a mimic!")) //Controls the mimic that spawns - forceMove(new_mimic) - new_mimic.real_crate = src - new_mimic.name = name - new_mimic.desc = desc - new_mimic.icon_state = "cmimicopen" - new_mimic.icon_living = "cmimicopen" - else - return ..() - else - return ..() - -/obj/structure/closet/crate/mimic/closet/ex_act(severity) //Stores Mimic Contents for later - for(var/obj/O in src.contents) - qdel(O) - qdel(src) - return - -/obj/structure/closet/crate/mimic/closet/damage(var/damage) - if(contents.len) - visible_message(span_bolddanger("The [src] makes out a crunchy noise as its contents are destroyed!")) - for(var/obj/O in src.contents) - qdel(O) - ..() - -/obj/structure/closet/crate/mimic/closet/safe - mimic_chance = 0 - mimic_active = FALSE - -/obj/structure/closet/crate/mimic/closet/guaranteed - mimic_chance = 100 - -/obj/structure/closet/crate/mimic/closet/dangerous - mimic_chance = 70 - -/obj/structure/closet/crate/mimic/closet/cointoss - mimic_chance = 50 - -/mob/living/simple_mob/vore/aggressive/mimic/closet - name = "old closet" - desc = "It's a basic storage unit. It seems awfully rickety." - icon_state = "cmimicopen" - icon_living = "cmimicopen" - - maxHealth = 50 - health = 50 - movement_cooldown = 7 - - melee_damage_lower = 8 - melee_damage_upper = 8 - attack_armor_pen = 25 // NOM NOM - - armor = list( - "melee" = 10, - "bullet" = 20, - "laser" = 20, - "energy" = 20, - "bomb" = 20, - "bio" = 100, - "rad" = 100) - -/mob/living/simple_mob/vore/aggressive/mimic/closet/will_show_tooltip() - return FALSE - -/mob/living/simple_mob/vore/aggressive/mimic/closet/death() - ..() - if(real_crate) - real_crate.forceMove(loc) - real_crate = null - qdel(src) - -//Floor Mimics... Because mimics you have to interact with to activate was not enough... - -/obj/effect/floormimic //As Floor Mimics are triggered by bumps rather than click interaction... They are effects rather than structures - name = "loose wooden floor" - desc = "The boards here look rather loose." - density = 0 - anchored = 1 - icon = 'modular_chomp/icons/mob/animal_ch.dmi' - icon_state = "wmimic" - var/mimic_chance = 30 - var/mimic_active = TRUE - var/mimic_type = /mob/living/simple_mob/vore/aggressive/mimic/floor - -/obj/effect/floormimic/Crossed(atom/movable/AM) - . = ..() - tryTrigger(AM) - -/obj/effect/floormimic/Bumped(atom/movable/AM) - . = ..() - tryTrigger(AM) - -/obj/effect/floormimic/proc/tryTrigger(atom/movable/victim) - if(!isliving(victim)) - return - var/mob/living/L = victim - if(L.hovering) - return - awaken(L) - -/obj/effect/floormimic/proc/awaken(mob/living/L) - if(!mimic_active) - qdel(src) - return - mimic_active = FALSE - if(!prob(mimic_chance)) - qdel(src) - return - var/mob/living/simple_mob/vore/aggressive/mimic/floor/new_mimic = new mimic_type(drop_location()) - visible_message(span_boldwarning("The [new_mimic] suddenly growls beneath you as it turns out to be a mimic!")) - qdel(src) - -/obj/effect/floormimic/attackby(obj/item/I, mob/living/L) - if(mimic_active) - awaken(L) - else - return ..() - -/obj/effect/floormimic/ex_act(severity) - qdel(src) - -/obj/effect/floormimic/safe - mimic_chance = 0 - -/obj/effect/floormimic/guaranteed - mimic_chance = 100 - -/obj/effect/floormimic/dangerous - mimic_chance = 70 - -/obj/effect/floormimic/cointoss - mimic_chance = 50 - -/mob/living/simple_mob/vore/aggressive/mimic/floor - name = "loose wooden floor" - desc = "The boards here look rather loose." - icon_state = "wmimicopen" - icon_living = "wmimicopen" - - faction = "mimic" - - maxHealth = 100 - health = 100 - movement_cooldown = 5 - - response_help = "touches" - response_disarm = "pushes" - response_harm = "hits" - - melee_damage_lower = 5 - melee_damage_upper = 5 - base_attack_cooldown = 5 - -/mob/living/simple_mob/vore/aggressive/mimic/floor/death() - qdel(src) - -/obj/effect/floormimic/tile - name = "loose floor tiles" - desc = "The tiles here look rather loose." - density = FALSE - anchored = TRUE - icon_state = "tmimic" - mimic_type = /mob/living/simple_mob/vore/aggressive/mimic/floor/tile - -/obj/effect/floormimic/tile/safe - mimic_chance = 0 - -/obj/effect/floormimic/tile/guaranteed - mimic_chance = 100 - -/obj/effect/floormimic/tile/dangerous - mimic_chance = 70 - -/obj/effect/floormimic/tile/cointoss - mimic_chance = 50 - -/mob/living/simple_mob/vore/aggressive/mimic/floor/tile - name = "loose floor tiles" - desc = "The tiles here look rather loose." - icon_state = "tmimicopen" - icon_living = "tmimicopen" - - faction = "mimic" - - maxHealth = 125 - health = 125 - movement_cooldown = 7 - - response_help = "touches" - response_disarm = "pushes" - response_harm = "hits" - - melee_damage_lower = 15 - melee_damage_upper = 15 - base_attack_cooldown = 10 - -/obj/effect/floormimic/plating - name = "loose plating" - desc = "The plating here looks rather loose." - density = FALSE - anchored = TRUE - icon_state = "pmimic" - mimic_type = /mob/living/simple_mob/vore/aggressive/mimic/floor/plating - -/obj/effect/floormimic/plating/safe - mimic_chance = 0 - -/obj/effect/floormimic/plating/guaranteed - mimic_chance = 100 - -/obj/effect/floormimic/plating/dangerous - mimic_chance = 70 - -/obj/effect/floormimic/plating/cointoss - mimic_chance = 50 - -/mob/living/simple_mob/vore/aggressive/mimic/floor/plating - name = "loose plating" - desc = "The plating here look rather loose." - icon_state = "pmimicopen" - icon_living = "pmimicopen" - - faction = "mimic" - - maxHealth = 150 - health = 150 - movement_cooldown = 7 - - response_help = "touches" - response_disarm = "pushes" - response_harm = "hits" - - melee_damage_lower = 15 - melee_damage_upper = 15 - base_attack_cooldown = 10 - attack_armor_pen = 50 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/mobs_monsters/clowns/regularclowns.dm b/code/modules/mob/living/simple_mob/subtypes/vore/mobs_monsters/clowns/regularclowns.dm index f57c38a334..284e1b0ea8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/mobs_monsters/clowns/regularclowns.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/mobs_monsters/clowns/regularclowns.dm @@ -5,7 +5,7 @@ say_list_type = /datum/say_list/clown - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /datum/say_list/clown speak = list("HONK", "Honk!", "Henk!") diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm index 3f7f33d771..2496a325ac 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm @@ -88,7 +88,7 @@ "rad" = 100 ) - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE glow_override = TRUE /mob/living/simple_mob/vore/oregrub/lava diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm index c22e2dceba..e8e0225909 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm @@ -281,7 +281,7 @@ switch(M.a_intent) if(I_HELP) if(health > 0) - if(M.zone_sel.selecting == BP_GROIN) //CHOMPEdit + if(M.zone_sel.selecting == BP_GROIN) if(M.vore_bellyrub(src)) return M.visible_message(span_notice("[M] [response_help] \the [src].")) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm b/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm index 86499c3495..5a0f318ae9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm @@ -151,17 +151,16 @@ /mob/living/simple_mob/vore/pakkun/load_default_bellies() . = ..() var/obj/belly/B = vore_selected - if(isbelly(B)) //ChompEDIT - fix a runtime - B.name = "stomach" - B.desc = "you land with a soft bump in what can only be described as a big soft slimy sack, the walls effortlessly stretching to match your every move with no sign of reaching any kind of elastic \ - limit - and to add insult to injury, it seems the thing is... pressing on you, kneading over the lump you make in its midsection, as though rubbing in the fact that you've just been caught." - B.absorbed_desc = "the endless smooshing and kneading has taken its toll, your form softening and sinking into the body of the greedy little reptile. It seems like you might be here for some time - \ - assuming you ever get out at all. For now though, you're stuck as some extra softness padding out a cute little lizard." - B.belly_fullscreen = "a_tumby" - B.escapechance = 25 - B.absorbchance = 0 - B.digestchance = 0 - B.digest_mode = DM_SELECT + B.name = "stomach" + B.desc = "you land with a soft bump in what can only be described as a big soft slimy sack, the walls effortlessly stretching to match your every move with no sign of reaching any kind of elastic \ + limit - and to add insult to injury, it seems the thing is... pressing on you, kneading over the lump you make in its midsection, as though rubbing in the fact that you've just been caught." + B.absorbed_desc = "the endless smooshing and kneading has taken its toll, your form softening and sinking into the body of the greedy little reptile. It seems like you might be here for some time - \ + assuming you ever get out at all. For now though, you're stuck as some extra softness padding out a cute little lizard." + B.belly_fullscreen = "a_tumby" + B.escapechance = 25 + B.absorbchance = 0 + B.digestchance = 0 + B.digest_mode = DM_SELECT /mob/living/simple_mob/vore/pakkun/attackby(var/obj/item/O, var/mob/user) //if they're newspapered, they'll spit out any junk they've eaten for whatever reason if(istype(O, /obj/item/newspaper) && !ckey && isturf(user.loc)) @@ -276,9 +275,8 @@ /mob/living/simple_mob/vore/pakkun/snapdragon/snappy/load_default_bellies() . = ..() var/obj/belly/B = vore_selected - if(isbelly(B)) //ChompEDIT - fix a runtime - B.digest_mode = DM_HOLD - B.desc = "the lizard gently yet insistently stuffs you down her gullet - evidently enjoying this moment of playtime as you land in a sprawled heap in the stretchy, clinging sack that makes up \ - most of her girth. Your movements are rewarded only with squeezing from outside, the skin of the reptile easily stretching out to match your movements no matter how hard you try to push. If anything, \ - wriggling about just seems to prompt the playful creature to mess with you more, mooshing her paws into the bulges you make, wrapping both arms around you and squeezing you tight, making it absolutely \ - plain that she's more than happy to just keep you in there - and is more than capable of doing so if she so chooses." + B.digest_mode = DM_HOLD + B.desc = "the lizard gently yet insistently stuffs you down her gullet - evidently enjoying this moment of playtime as you land in a sprawled heap in the stretchy, clinging sack that makes up \ + most of her girth. Your movements are rewarded only with squeezing from outside, the skin of the reptile easily stretching out to match your movements no matter how hard you try to push. If anything, \ + wriggling about just seems to prompt the playful creature to mess with you more, mooshing her paws into the bulges you make, wrapping both arms around you and squeezing you tight, making it absolutely \ + plain that she's more than happy to just keep you in there - and is more than capable of doing so if she so chooses." diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm b/code/modules/mob/living/simple_mob/subtypes/vore/panther_thor.dm similarity index 99% rename from modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm rename to code/modules/mob/living/simple_mob/subtypes/vore/panther_thor.dm index e7d8f1f5c1..108ed5910a 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/panther_thor.dm @@ -7,7 +7,7 @@ icon_living = "panther" icon_rest = "panther-rest" icon_dead = "panther-dead" - icon = 'modular_chomp/icons/mob/vore64x32_ch.dmi' + icon = 'icons/mob/vore64x32.dmi' vis_height = 64 faction = FACTION_PANTHER diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/plants/pitcher.dm b/code/modules/mob/living/simple_mob/subtypes/vore/plants/pitcher.dm similarity index 99% rename from modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/plants/pitcher.dm rename to code/modules/mob/living/simple_mob/subtypes/vore/plants/pitcher.dm index 7a18754c61..6fe815f026 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/plants/pitcher.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/plants/pitcher.dm @@ -12,7 +12,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( "Doesn't the pitcher plant smell amazing?")) //Messages sent to nearby players if the pitcher is trying to lure prey. This is global to prevent a new list every time a new pitcher plant spawns. //Pitcher plants, a passive carnivorous plant mob for xenobio and space vine spawning. -//Consider making immune to space vine entangling. Check entangle_immunity in the old CHOMPstation github for an example. +//Consider making immune to space vine entangling. /mob/living/simple_mob/vore/pitcher_plant name = "pitcher plant" desc = "A carnivorous pitcher plant, bigger than a man." @@ -21,7 +21,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( icon_state = "pitcher_plant" icon_living = "pitcher_plant" icon_dead = "pitcher_plant_dead" - icon = 'modular_chomp/icons/mob/vore_ch.dmi' + icon = 'icons/mob/vore.dmi' anchored = 1 // Rooted plant. Only killing it will let you move it. maxHealth = 200 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/plants.dm b/code/modules/mob/living/simple_mob/subtypes/vore/plants/plants.dm similarity index 100% rename from code/modules/mob/living/simple_mob/subtypes/vore/plants.dm rename to code/modules/mob/living/simple_mob/subtypes/vore/plants/plants.dm diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/rabbit.dm b/code/modules/mob/living/simple_mob/subtypes/vore/rabbit.dm index 52f89e48f5..3e56ed14b8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/rabbit.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/rabbit.dm @@ -93,32 +93,17 @@ if(pounce_chance) PounceTarget(user, pounce_chance) -// CHOMPEdit start: More voremob bellies! /mob/living/simple_mob/vore/rabbit/load_default_bellies() . = ..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "With a sudden pounce, the rabbit begins swallowing you down with ease! A pink maw and surprisingly unintimidating teeth give way to the thing's pink, tight throat, until you're crammed down inside it's gut! Unless you happen to be drastically smaller than it, the inside of this thing's gut is incredibly cramped, as the fleshy pink walls undulate over your form. It's clearly still able to move with you inside somehow, despite the tiny size of the thing, as gastric sounds flood your ears. You've been bested by a RABBIT of all things!" - B.vore_sound = "Tauric Swallow" // CHOMPedit - Fancy Vore Sounds - B.release_sound = "Pred Escape" // CHOMPedit - Fancy Vore Sounds - B.fancy_vore = 1 // CHOMPedit - Fancy Vore Sounds - B.belly_fullscreen_color = "#b15aac" // CHOMPedit - Belly Fullscreen - B.belly_fullscreen = "anim_belly" // CHOMPedit - Belly Fullscreen - - /* // Commented out as unfortunately I suck at writing rabbit guts, given I'm mostly a canine and such pred. :p - B.emote_lists[DM_HOLD] = list( - "", - "", - "") - - B.emote_lists[DM_DIGEST] = list( - "", - "", - "") - */ - -// CHOMPEdit end: More voremob bellies! + B.vore_sound = "Tauric Swallow" + B.release_sound = "Pred Escape" + B.fancy_vore = TRUE + B.belly_fullscreen_color = "#b15aac" + B.belly_fullscreen = "anim_belly" /datum/say_list/rabbit speak = list("chrrrs.") diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm b/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm index d49b8f915d..022e81c8f9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm @@ -62,7 +62,7 @@ vore_active = TRUE vore_capacity = 1 - vore_pounce_chance = 65 // CHOMPEdit: Higher pounce chance to omf. + vore_pounce_chance = 65 vore_icons = SA_ICON_LIVING | SA_ICON_REST var/life_since_foodscan = 0 @@ -70,7 +70,7 @@ say_list_type = /datum/say_list/rat ai_holder_type = /datum/ai_holder/simple_mob/melee/rat - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE allow_mind_transfer = TRUE /mob/living/simple_mob/vore/aggressive/rat/load_default_bellies() @@ -78,11 +78,11 @@ var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "In a cruel game of cat-and-mouse gone horribly wrong, you struggle to breathe clearly as the giant rat holds your head in its jaws, the rest of its bulk pinning you to the ground. Slimy slurps and its own muffled squeaking fill your senses as it simultaneously tosses its head while backing up. Quickly, ravenously consuming you, bit by bit, packing you down its gullet no matter how you struggle. Passing by its excited heartbeat, your thoroughly slickened head pushes out into its awaiting stomach, a dark and humid hammock eager to accept the rest of you. Soon, those too-warm, plush walls clench and squeeze around you with undeniable need! A need for mere filling, or, perhaps, a proper meal?" - B.vore_sound = "Tauric Swallow" // CHOMPedit - Fancy Vore Sounds - B.release_sound = "Pred Escape" // CHOMPedit - Fancy Vore Sounds - B.fancy_vore = 1 // CHOMPedit - Fancy Vore Sounds - B.belly_fullscreen_color = "#c47cb4" // CHOMPedit - Belly Fullscreen - B.belly_fullscreen = "anim_belly" // CHOMPedit - Belly Fullscreen + B.vore_sound = "Tauric Swallow" + B.release_sound = "Pred Escape" + B.fancy_vore = TRUE + B.belly_fullscreen_color = "#c47cb4" + B.belly_fullscreen = "anim_belly" B.emote_lists[DM_HOLD] = list( "As time passes, the massive rat's stomach slowly churns and squeezes down around you, packing you into an easier to carry bundle amidst that oddly soothing massage.", @@ -292,3 +292,39 @@ /datum/ai_holder/simple_mob/melee/rat speak_chance = 2 + +/mob/living/simple_mob/vore/aggressive/rat/event + maxHealth = 50 + health = 50 + vore_pounce_chance = 10 + + can_be_drop_prey = FALSE + +/mob/living/simple_mob/vore/aggressive/rat/labrat + name = "giant lab rat" + desc = "In what passes for a hierarchy among lab rats, this one is a boss." + icon_state = "labrat" + icon_living = "labrat" + icon_dead = "labrat-dead" + icon_rest = "labrat_rest" + faction = "neutral" + icon = 'icons/mob/vore64x32.dmi' + +/mob/living/simple_mob/vore/aggressive/rat/labrat/genetics + name = "Nibbles" + desc = "A giant rat that made it's nest in an abandoned genetics lab. This one seems fairly docile." + ai_holder_type = /datum/ai_holder/simple_mob/retaliate + + vore_active = 1 + vore_capacity = 1 + vore_escape_chance = 20 + swallowTime = 25 + vore_bump_chance = 100 + faction_bump_vore = 1 + vore_standing_too = TRUE + vore_pounce_chance = 75 + vore_pounce_maxhealth = 80 + vore_bump_emote = "knocks over and attempts to engulf" + + can_be_drop_prey = FALSE + allow_mind_transfer = FALSE diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/rat_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/rat_ch.dm deleted file mode 100644 index 72f5750691..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/vore/rat_ch.dm +++ /dev/null @@ -1,35 +0,0 @@ -/mob/living/simple_mob/vore/aggressive/rat/event - maxHealth = 50 - health = 50 - vore_pounce_chance = 10 - - can_be_drop_prey = FALSE - -/mob/living/simple_mob/vore/aggressive/rat/labrat - name = "giant lab rat" - desc = "In what passes for a hierarchy among lab rats, this one is a boss." - icon_state = "labrat" - icon_living = "labrat" - icon_dead = "labrat-dead" - icon_rest = "labrat_rest" - faction = "neutral" - icon = 'modular_chomp/icons/mob/vore64x32_ch.dmi' - -/mob/living/simple_mob/vore/aggressive/rat/labrat/genetics - name = "Nibbles" - desc = "A giant rat that made it's nest in an abandoned genetics lab. This one seems fairly docile." - ai_holder_type = /datum/ai_holder/simple_mob/retaliate - - vore_active = 1 - vore_capacity = 1 - vore_escape_chance = 20 - swallowTime = 25 - vore_bump_chance = 100 - faction_bump_vore = 1 - vore_standing_too = TRUE - vore_pounce_chance = 75 - vore_pounce_maxhealth = 80 - vore_bump_emote = "knocks over and attempts to engulf" - - can_be_drop_prey = FALSE - allow_mind_transfer = FALSE diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/reindeer.dm b/code/modules/mob/living/simple_mob/subtypes/vore/reindeer.dm similarity index 96% rename from modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/reindeer.dm rename to code/modules/mob/living/simple_mob/subtypes/vore/reindeer.dm index d4a7c1b126..140312da34 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/reindeer.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/reindeer.dm @@ -12,7 +12,7 @@ icon_living = "reindeer" icon_dead = "reindeer-dead" icon_rest = "reindeer_rest" - icon = 'modular_chomp/icons/mob/vore64x32_ch.dmi' + icon = 'icons/mob/vore64x32.dmi' maxHealth = 100 health = 100 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/scel.dm b/code/modules/mob/living/simple_mob/subtypes/vore/scel.dm index cc82a83295..592911df85 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/scel.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/scel.dm @@ -207,7 +207,7 @@ Both their flesh and 'goo' dissipate into a fine black mist within hours of being seperated from its host, or the death of the subject. \ Scel are sapient, and are therefore hard to predict, many have been immediately hostile, while a rare few have even taught themselves our language. Contact has been sparse though. What has been discovered is that most Scel seem to act independantly, with no formal governance. \ Their alien mindset seems to have difficulty adapting to our world, further causing contact attempts to degrade into misunderstandings. \ - Scel, once breached into realspace, seem incredibly hesitant to return to their own reality, and are likely to be found in places with little to no natural light, as it seems to confuse their senses." + Scel, once breached into realspace, seem incredibly hesitant to return to their own reality, and are likely to be found in places with little to no natural light, as it seems to confuse their senses." // CHOMPEdit value = CATALOGUER_REWARD_HARD /mob/living/simple_mob/vore/scel/orange diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm b/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm index d43c5beca4..839a614806 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm @@ -14,7 +14,7 @@ yet to uncover. \
\ The lack of chitin on the underside of its abdomen is very elastic and stretchable, \ - allowing the drone to carry multiple large prey inside of its stomach with relative ease." //CHOMPedit + allowing the drone to carry multiple large prey inside of its stomach with relative ease." value = CATALOGUER_REWARD_MEDIUM /mob/living/simple_mob/vore/sect_drone diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm b/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm index 20e7b716de..3d289ffc06 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm @@ -15,9 +15,9 @@ inconsistent. A sect queen can vary from hostile to docile depending on certain factors that scientists have \ yet to uncover. \
\ - The lack flesh on the underside of its abdomen is very elastic and stretchable, \ + The flesh on the underside of its abdomen is very elastic and stretchable, \ allowing the queen to carry multiple large prey inside of its stomach with ease. There is no know limit to home much \ - prey a single specimen can carry and scientists are wary to find said limit." //CHOMPedit + prey a single specimen can carry and scientists are wary to find said limit." value = CATALOGUER_REWARD_MEDIUM /mob/living/simple_mob/vore/sect_queen diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types.dm index 2bf05a7579..bf321775c2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types.dm @@ -291,3 +291,138 @@ you to curl up a bit. You can feel her rub at you some through the layers of flesh and fluff, while aches \ and pains begin to fade away across your body." player_msg = "Mar? Mar mar. Mar mar mar. Mar. Mar mar? Mar! Mar. Marrrr." + +//Special event mob. "Hunger." - Rakshasa +/mob/living/simple_mob/shadekin/red/rakshasa + name ="Rakshasa" + desc = "A scary, black shadekin? Their body oozes like goop." + icon_state = "rakshasa" + vore_stomach_flavor = "You're floating in a warm, viscous goop, too dark to see. \ + Your efforts to find light have failed. Darkness consumes you. \ + Rakshasa's gelatenous body squeezes over your form, leaving no inch unmolested. \ + The hot goop you float in makes it hard to breathe; all consuming of space and light. \ + Your body feels hot, growing weaker, more tired. Draining. Darkness coming. \ + You struggle to stay awake while floating helplessly in the goo." + player_msg = "You are Rakshasa. You are not to directly harm crew, only consume. You never speak a language. You have special emotes: 'evillaugh', 'evilno', 'evilbreath', 'evilbreath2', and 'goodripsound'" + maxHealth = 1000000000000 + health = 1000000000000 + eye_state = "BLUE EYES" + eye_icon_state = "e_rakshasa" + comp = /datum/component/shadekin/full/rakshasa + +/mob/living/simple_mob/shadekin/red/rakshasa/Initialize(mapload) + . = ..() + if(comp) + comp.dark_energy_infinite = TRUE + +/mob/living/simple_mob/shadekin/red/rakshasa/get_available_emotes() + . = global._simple_mob_default_emotes.Copy() + . += /decl/emote/audible/evil_laugh + . += /decl/emote/audible/evil_no + . += /decl/emote/audible/evil_breathing + . += /decl/emote/audible/evil_breathing_2 + . += /decl/emote/audible/goodripsound + +/mob/living/simple_mob/shadekin/blue/luna + name = "Luna" + desc = "She appears to be a fuzzy critter of some sort. Her eyes shimmer a dark blue, glancing around curiously." + icon_state = "luna" + eye_desc = "blue eyes" + vore_stomach_flavor = "Dark blue flesh fills your vision as you slip past the Shadekin's tongue and into the darkness \ + of her gullet. The flesh around you seems squishy and pliable and malleable to say the least, warmth rolling up \ + your body as the humid air rises across the deeper you slide into the darkness of her stomach. As you splash \ + inside, you curl up comfortably inside the walls that churn and squeeze around you, any fidgeting quickly \ + subdued by the strength of the walls, and any movement of your predator seems to coax a light sway from \ + your current prison. The slime inside stuck fairly well, though harmless - your aches and pains slowly soothing \ + up and fading away." + player_msg = "You are a shadekin that goes by the name of Luna. Curious, you have tasked yourself and yourself alone \ + with studying this foreign world. Learn their language. Learn their culture. Adapt. Everything is wonderful and new, \ + and your mind is set on retaining knowledge of these odd planescape." + +//"All your chickens are belong to me!" - Zylas +/mob/living/simple_mob/shadekin/purple/zylas + name ="Zylas" + desc = "He's a chubby looking creature, black and grey fur accompanied by purple eyes and a large hoody." + icon_state = "zylashoody" + eye_desc = "purple eyes" + vore_stomach_flavor = "You are trapped in a cramped tight space. The color purple seems to dominate your vision. \ + His walls rolled over your form as you lay trapped in his depths. There wasnt a drop of fluid in sight inside that \ + stomach. Instead, you could feel your energy slowly draining away over time, like... he was leeching off you." + player_msg = "You are Zylas. You enjoy scaring the local population and eating every chicken you find." + +//"Two scarves. No more, No Less." -Muninn +/mob/living/simple_mob/shadekin/blue/muninn + name ="Muninn" + desc = "A gray furred shadekin, a little on the hefty side. Rocks two scarves, one on the neck, one on the tail. \ + He seems eager to take in the various sights and sounds of the station" + icon_state = "muninn" + eye_desc = "blue eyes" + vore_stomach_flavor = "You're stuck in a warm, tight stomach. \ + A blue glow, as soft as the walls surrounding you, illuminates the cramped chamber. \ + Muninn's walls gently squeeze over your form, like a tight, yet comfortable hug. \ + The gut itself was relatively dry, only slightly damp. \ + As Muninn ambles along, you'd gently sway within. It's quite the nice place to stay for a while." + player_msg = "You are Muninn. Today you feel... Curious." + +//"Here's a little lesson in the trickeries" -Muninn +/mob/living/simple_mob/shadekin/purple/muninn + name ="Muninn" + desc = "A gray furred shadekin, a little on the hefty side. Rocks two scarves, one on the neck, one on the tail.\ + He seems a little mischevious... better keep an eye on him." + icon_state = "muninn" + eye_desc = "purple eyes" + vore_stomach_flavor = "You're stuck in a warm, tight stomach. \ + A purple glow, as soft as the walls surrounding you, illuminates the cramped chamber. \ + Muninn's walls gently squeeze over your form, like a tight hug. \ + The gut itself was relatively dry, only slightly damp. \ + It didn't seem that Muninn was digesting you. More like... sapping your energy and making you feel tired. \ + A nap in this comfortable chamber wouldn't be the worst thing, would it?" + player_msg = "You are Muninn. Today you feel... Mischevious." + +//Whealty's shadekin anno! +/mob/living/simple_mob/shadekin/purple/anno + name ="Anno" + desc = "A white furred shadekin with a chubby form. His ears seem to be close to even in length and his snout seems longer than the usual.\ + He seems energetic and playful." + icon_state = "anno" + eye_desc = "purple eyes" + vore_stomach_flavor = "You're stuck in a warm, tight stomach. \ + A purple glow, as soft as the walls surrounding you, illuminates the cramped chamber. \ + Anno's stomach walls squeeze and hug over your form somewhat tightly. \ + The gut itself was wetish and slightly slick. \ + The gut seemed somewhat inviting with the warmth and softness, yet there was an ominous feeling to it with all the noises it made.\ + You'll probably be safe in here. Probably." + player_msg = "You are Anno, you are energetic and playful" + +/mob/living/simple_mob/shadekin/blue/roti + name ="Roti" + desc = "Roti is a shadekin with blue eyes, is chubby since he has eaten others before hand. He enjoys chocolate, the taste of it, the smell of it, he just wants anything sweet and chocolately to be in his belly. So be careful around him this is also a way to summon him by laying around chocolate and calling him out." + icon_state = "roti" + eye_desc = "blue eyes" + vore_stomach_flavor = "You stare into Roti's maw as he moves it towards your head, putting it in and tasting your sweet delicious chocolately flavor. \ + Wet saliva covers your head as he pushes you inward, gulping down your head and shoulders into his pulsating throat. It pulses and eases you downward towards your destination \ + cramming your torso into his maw and taking wet SCHLURP, GLUK, to get it down and up to your waist. Roti continues to taste you all over wanting that succulent flavor \ + to himself. Another loud wet swallow and down goes your waist into his hungry maw, lifting up the legs high into the sky while allowing gravity and his gulps \ + to send you packing away into his chubby gut that now expands to fit you inside of the wet chamber. At least you were safe for now that is." + player_msg = "You are Roti, a curious shadekin that wishes to learn from the station and eventually speak with them." + +//kcin2001's soft shadekin +/mob/living/simple_mob/shadekin/green/soft + name = "Softpatch" + desc = "A green eyed brown shadekin, looks fluffy and a bit chubby around the middle underneath his well worn cloak \ + He seems curious but ready to flee" + icon_state = "soft" + eye_desc = "soft green eyes" +// vore_stomach_flavor = "" + player_msg = "You are Softpatch, you like things that are soft and are curious about the beings in realspace" + +//"Marr marr marr-marr maaarr marr?~ (Ever had your ass eaten by a shadekin before?~)" - Yrmir (Shadowfire117) +/mob/living/simple_mob/shadekin/orange/yrmir + name = "Green and black shadekin" //Name is Yrmir and known only to other shadekins he talks to, he doesn't speak common to any degree so far + desc = "An orange eyed shadekin, this one has a very dark coat with several spots with faintly glowing green patches of fur. \ + Said fur looks quite soft and warm with it filling out a bit, a closer look tells its a slim upper body while rump, hips and thighs are nice and filled out well. \ + While he may have a more padded out soft build below, the masculine part of them is quite visible as a large fat furred sack and sheath rests comfortably between his thighs. \ + From the way he looks at you, you get the feeling he is possibly scheming something fun, at least for himself." + icon_state = "yrmir" + eye_desc = "glimmering orange eyes" + player_msg = "You are Yrmir, an orange shadekin with interest in revelry, trickery and pleasures. Mostly for you but to a degree to the willing and unwilling that interest you." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types_ch.dm deleted file mode 100644 index c2cbd1bfb5..0000000000 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types_ch.dm +++ /dev/null @@ -1,182 +0,0 @@ -/////////////////////////////////////////////////////////////////CHOMPEDIT Custom shadekin mini tutorial -//Proto shadekin; AKA; Basic how to make your own shadekin; -Shark - -//Step 1; sprites; -//File for body = icons/mob/vore_shadekin.dmi -//File for tail = icons/mob/vore_shadekin64.dmi -//Sprites can be either made inside of DM or you can use a Program of your choice and save the files as PNG and then import them -//If you need help learning how to use DMs interface to import/export sprites and make states you can always ask in the discord. - -//Step 2; Code -//Now this depends on what type of eye colour you want -//For a red we use -///mob/living/simple_animal/shadekin/red -//then we simply add our shadekins name at the end (unless its used already) -/mob/living/simple_mob/shadekin/red/proto - name ="Proto" - //This here will be our shadekins name - - desc = "An invisible entity not meant for use." - //here goes a lil tidbit people can see when examining the shadekin. Multiple lines works just as on the vore part - - icon_state = "proto" - //this will most likely also be your shadekins name, it corresponds to the name you gave the tail and body state in the DMIs - //so if you named the body state "proto" and "proto-1" then icon_state should be called "proto" - - vore_stomach_flavor = "You stared into the void,\ - the void decided you look tasty,\ - now you are in the void, pretty wet" - //This is what people see when they drop into your gut! the backslashes at the end of the sentence indicate the next text will be on its own line! - - - player_msg = "Proto is you, Proto shouldn't exist" - //This message pops up when you are put into your shadekin - //I recommend you use it as a way to remind yourself of how you want to act generally as your shadekin. - -//Step 3; PR -// Assuming you already have a Fork of chompstation, make sure you got your files in order -// and then simply make a new pull request to our github. - -//Now once you pushed the new DMIs with your added sprites to our github. -//And you finished writing this code section for your shadekin and pushed that too. You are done. -//If this is your first time I recommend getting someone to look over your work. - -/////////////////////////////////////////////////////////////////CHOMP TUTORIAL END - - - -//Special event mob. "Hunger." - Rakshasa -/mob/living/simple_mob/shadekin/red/rakshasa - name ="Rakshasa" - desc = "A scary, black shadekin? Their body oozes like goop." - icon_state = "rakshasa" - vore_stomach_flavor = "You're floating in a warm, viscous goop, too dark to see. \ - Your efforts to find light have failed. Darkness consumes you. \ - Rakshasa's gelatenous body squeezes over your form, leaving no inch unmolested. \ - The hot goop you float in makes it hard to breathe; all consuming of space and light. \ - Your body feels hot, growing weaker, more tired. Draining. Darkness coming. \ - You struggle to stay awake while floating helplessly in the goo." - player_msg = "You are Rakshasa. You are not to directly harm crew, only consume. You never speak a language. You have special emotes: 'evillaugh', 'evilno', 'evilbreath', 'evilbreath2', and 'goodripsound'" - maxHealth = 1000000000000 - health = 1000000000000 - eye_state = "BLUE EYES" - eye_icon_state = "e_rakshasa" - comp = /datum/component/shadekin/full/rakshasa - -/mob/living/simple_mob/shadekin/red/rakshasa/Initialize(mapload) - . = ..() - if(comp) - comp.dark_energy_infinite = TRUE - -/mob/living/simple_mob/shadekin/red/rakshasa/get_available_emotes() - . = global._simple_mob_default_emotes.Copy() - . += /decl/emote/audible/evil_laugh - . += /decl/emote/audible/evil_no - . += /decl/emote/audible/evil_breathing - . += /decl/emote/audible/evil_breathing_2 - . += /decl/emote/audible/goodripsound - -/mob/living/simple_mob/shadekin/blue/luna - name = "Luna" - desc = "She appears to be a fuzzy critter of some sort. Her eyes shimmer a dark blue, glancing around curiously." - icon_state = "luna" - eye_desc = "blue eyes" - vore_stomach_flavor = "Dark blue flesh fills your vision as you slip past the Shadekin's tongue and into the darkness \ - of her gullet. The flesh around you seems squishy and pliable and malleable to say the least, warmth rolling up \ - your body as the humid air rises across the deeper you slide into the darkness of her stomach. As you splash \ - inside, you curl up comfortably inside the walls that churn and squeeze around you, any fidgeting quickly \ - subdued by the strength of the walls, and any movement of your predator seems to coax a light sway from \ - your current prison. The slime inside stuck fairly well, though harmless - your aches and pains slowly soothing \ - up and fading away." - player_msg = "You are a shadekin that goes by the name of Luna. Curious, you have tasked yourself and yourself alone \ - with studying this foreign world. Learn their language. Learn their culture. Adapt. Everything is wonderful and new, \ - and your mind is set on retaining knowledge of these odd planescape." - -//"All your chickens are belong to me!" - Zylas -/mob/living/simple_mob/shadekin/purple/zylas - name ="Zylas" - desc = "He's a chubby looking creature, black and grey fur accompanied by purple eyes and a large hoody." - icon_state = "zylashoody" - eye_desc = "purple eyes" - vore_stomach_flavor = "You are trapped in a cramped tight space. The color purple seems to dominate your vision. \ - His walls rolled over your form as you lay trapped in his depths. There wasnt a drop of fluid in sight inside that \ - stomach. Instead, you could feel your energy slowly draining away over time, like... he was leeching off you." - player_msg = "You are Zylas. You enjoy scaring the local population and eating every chicken you find." - -//"Two scarves. No more, No Less." -Muninn -/mob/living/simple_mob/shadekin/blue/muninn - name ="Muninn" - desc = "A gray furred shadekin, a little on the hefty side. Rocks two scarves, one on the neck, one on the tail. \ - He seems eager to take in the various sights and sounds of the station" - icon_state = "muninn" - eye_desc = "blue eyes" - vore_stomach_flavor = "You're stuck in a warm, tight stomach. \ - A blue glow, as soft as the walls surrounding you, illuminates the cramped chamber. \ - Muninn's walls gently squeeze over your form, like a tight, yet comfortable hug. \ - The gut itself was relatively dry, only slightly damp. \ - As Muninn ambles along, you'd gently sway within. It's quite the nice place to stay for a while." - player_msg = "You are Muninn. Today you feel... Curious." - -//"Here's a little lesson in the trickeries" -Muninn -/mob/living/simple_mob/shadekin/purple/muninn - name ="Muninn" - desc = "A gray furred shadekin, a little on the hefty side. Rocks two scarves, one on the neck, one on the tail.\ - He seems a little mischevious... better keep an eye on him." - icon_state = "muninn" - eye_desc = "purple eyes" - vore_stomach_flavor = "You're stuck in a warm, tight stomach. \ - A purple glow, as soft as the walls surrounding you, illuminates the cramped chamber. \ - Muninn's walls gently squeeze over your form, like a tight hug. \ - The gut itself was relatively dry, only slightly damp. \ - It didn't seem that Muninn was digesting you. More like... sapping your energy and making you feel tired. \ - A nap in this comfortable chamber wouldn't be the worst thing, would it?" - player_msg = "You are Muninn. Today you feel... Mischevious." - -//Whealty's shadekin anno! -/mob/living/simple_mob/shadekin/purple/anno - name ="Anno" - desc = "A white furred shadekin with a chubby form. His ears seem to be close to even in length and his snout seems longer than the usual.\ - He seems energetic and playful." - icon_state = "anno" - eye_desc = "purple eyes" - vore_stomach_flavor = "You're stuck in a warm, tight stomach. \ - A purple glow, as soft as the walls surrounding you, illuminates the cramped chamber. \ - Anno's stomach walls squeeze and hug over your form somewhat tightly. \ - The gut itself was wetish and slightly slick. \ - The gut seemed somewhat inviting with the warmth and softness, yet there was an ominous feeling to it with all the noises it made.\ - You'll probably be safe in here. Probably." - player_msg = "You are Anno, you are energetic and playful" - -/mob/living/simple_mob/shadekin/blue/roti - name ="Roti" - desc = "Roti is a shadekin with blue eyes, is chubby since he has eaten others before hand. He enjoys chocolate, the taste of it, the smell of it, he just wants anything sweet and chocolately to be in his belly. So be careful around him this is also a way to summon him by laying around chocolate and calling him out." - icon_state = "roti" - eye_desc = "blue eyes" - vore_stomach_flavor = "You stare into Roti's maw as he moves it towards your head, putting it in and tasting your sweet delicious chocolately flavor. \ - Wet saliva covers your head as he pushes you inward, gulping down your head and shoulders into his pulsating throat. It pulses and eases you downward towards your destination \ - cramming your torso into his maw and taking wet SCHLURP, GLUK, to get it down and up to your waist. Roti continues to taste you all over wanting that succulent flavor \ - to himself. Another loud wet swallow and down goes your waist into his hungry maw, lifting up the legs high into the sky while allowing gravity and his gulps \ - to send you packing away into his chubby gut that now expands to fit you inside of the wet chamber. At least you were safe for now that is." - player_msg = "You are Roti, a curious shadekin that wishes to learn from the station and eventually speak with them." - -//kcin2001's soft shadekin -/mob/living/simple_mob/shadekin/green/soft - name = "Softpatch" - desc = "A green eyed brown shadekin, looks fluffy and a bit chubby around the middle underneath his well worn cloak \ - He seems curious but ready to flee" - icon_state = "soft" - eye_desc = "soft green eyes" -// vore_stomach_flavor = "" - player_msg = "You are Softpatch, you like things that are soft and are curious about the beings in realspace" - -//"Marr marr marr-marr maaarr marr?~ (Ever had your ass eaten by a shadekin before?~)" - Yrmir (Shadowfire117) -/mob/living/simple_mob/shadekin/orange/yrmir - name = "Green and black shadekin" //Name is Yrmir and known only to other shadekins he talks to, he doesn't speak common to any degree so far - desc = "An orange eyed shadekin, this one has a very dark coat with several spots with faintly glowing green patches of fur. \ - Said fur looks quite soft and warm with it filling out a bit, a closer look tells its a slim upper body while rump, hips and thighs are nice and filled out well. \ - While he may have a more padded out soft build below, the masculine part of them is quite visible as a large fat furred sack and sheath rests comfortably between his thighs. \ - From the way he looks at you, you get the feeling he is possibly scheming something fun, at least for himself." - icon_state = "yrmir" - eye_desc = "glimmering orange eyes" -// vore_stomach_flavor = "" - player_msg = "You are Yrmir, an orange shadekin with interest in revelry, trickery and pleasures. Mostly for you but to a degree to the willing and unwilling that interest you." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/slug.dm similarity index 99% rename from code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm rename to code/modules/mob/living/simple_mob/subtypes/vore/slug.dm index d1270ba804..c41aea0d02 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/slug.dm @@ -5,7 +5,7 @@ desc = "A giant, cold-tolerant slug. It seems excessively passive." catalogue_data = list(/datum/category_item/catalogue/fauna/slug) tt_desc = "S Arion hortensis" - icon = 'modular_chomp/icons/mob/vore_ch.dmi' + icon = 'icons/mob/vore.dmi' icon_dead = "slug-dead" icon_living = "slug" icon_state = "slug" @@ -43,7 +43,7 @@ var/slime_max = 35 //With a slug which moves once every 10 seconds and a 5 minute delete timer, this should never exceed 30. var/mob/living/vore_memory = null - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE /mob/living/simple_mob/vore/slug //I guess separating the vore variables is a little more organized? vore_bump_chance = 100 //Always attempt a bump nom if possible... diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm b/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm index f47580c788..196b272006 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm @@ -54,7 +54,7 @@ ai_holder_type = /datum/ai_holder/simple_mob/melee - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE allow_mind_transfer = TRUE // Activate Noms! diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm index c2af92cd17..34fd1a782d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm @@ -15,8 +15,7 @@ List of things solar grubs should be able to do: Therefore, if you see the grubs, kill them while they're small, or things might escalate." // TODO: PORT SOLAR MOTHS - Rykka value = CATALOGUER_REWARD_EASY -var/global/moth_amount = 0 // CHOMPEnable, Rykka waz here. *pawstamp* -// Ace was here too. Vorestation doesn't have solar moths yet! Uncomment this if someone else adds them. I don't know if Vorestation will like them. +GLOBAL_VAR_INIT(moth_amount, 0) /mob/living/simple_mob/vore/solargrub name = "juvenile solargrub" @@ -28,10 +27,10 @@ var/global/moth_amount = 0 // CHOMPEnable, Rykka waz here. *pawstamp* icon_dead = "solargrub-dead" var/charge = null // The amount of power we sucked off, in K as in THOUSANDS. - // CHOMPEdit Start + var/can_evolve = 1 // To decide whether this subspecies is allowed to become a queen, which Ace has set as 0 because there's no evolution form yet. var/adult_forms = "/mob/living/simple_mob/vore/solarmoth" // This decides what mob the queen form is. ex adult_forms = /mob/living/simple_mob/subtypes/vore/solarmoth - // CHOMPEdit End + // Don't leave that as null if you add solar moths. faction = FACTION_GRUBS @@ -62,7 +61,7 @@ var/global/moth_amount = 0 // CHOMPEnable, Rykka waz here. *pawstamp* var/powerdraw = 100000 var/tracked = FALSE - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE allow_mind_transfer = TRUE glow_override = TRUE @@ -104,16 +103,14 @@ var/global/moth_amount = 0 // CHOMPEnable, Rykka waz here. *pawstamp* else if(!attached && anchored) anchored = FALSE PN = null - //CHOMPEnable Start - if(prob(1) && charge >= 32000 && can_evolve == 1 && moth_amount < 1) //it's reading from the moth_amount global list to determine if it can evolve. There should only ever be a maxcap of 1 existing solar moth alive at any time. TODO: make the code decrease the list after 1 has spawned this shift. + if(prob(1) && charge >= 32000 && can_evolve == 1 && GLOB.moth_amount < 1) //it's reading from the moth_amount global list to determine if it can evolve. There should only ever be a maxcap of 1 existing solar moth alive at any time. TODO: make the code decrease the list after 1 has spawned this shift. anchored = 0 PN = null release_vore_contents() if(prey_excludes) prey_excludes.Cut() - moth_amount = moth_amount + 1 + GLOB.moth_amount = GLOB.moth_amount + 1 death_star() - // CHOMPEnable End /mob/living/simple_mob/vore/solargrub/proc/death_star() visible_message(span_warning("\The [src]'s shell rips open and evolves!")) @@ -204,7 +201,7 @@ var/global/moth_amount = 0 // CHOMPEnable, Rykka waz here. *pawstamp* "The solargrub chitters in irritation at your continued solidity, followed by a string of crushingly tight stomach clenches that grind its caustic stomach ooze into your body!", "The deceptively severe heat trapped within the solargrub works in tandem with its inner muscles and your tingling, prickling stomach juice bath to weaken you!") -/datum/ai_holder/simple_mob/retaliate/solargrub/react_to_attack(atom/movable/attacker) +/datum/ai_holder/simple_mob/retaliate/solargrub/react_to_attack(atom/movable/attacker, ignore_timers) holder.anchored = FALSE holder.set_AI_busy(FALSE) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solarmoth_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solarmoth.dm similarity index 98% rename from code/modules/mob/living/simple_mob/subtypes/vore/solarmoth_ch.dm rename to code/modules/mob/living/simple_mob/subtypes/vore/solarmoth.dm index bb3d257fc6..0ebd13d816 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/solarmoth_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/solarmoth.dm @@ -131,7 +131,7 @@ /mob/living/simple_mob/vore/solarmoth/proc/explode() src.anchored = 0 set_light(0) - moth_amount = clamp(moth_amount - 1, 0, 1) + GLOB.moth_amount = clamp(GLOB.moth_amount - 1, 0, 1) if(empulse(src, emp_heavy, emp_med, emp_light, emp_long)) qdel(src) return @@ -193,8 +193,7 @@ door.blocked = 0 door.open(1) - spawn(100) - nospampls = 0 + VARSET_IN(src, nospampls, 0, 10 SECONDS) /mob/living/simple_mob/vore/solarmoth/lunarmoth/Life() ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/stalker.dm b/code/modules/mob/living/simple_mob/subtypes/vore/stalker.dm index c48bb2ec3a..7c135298b0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/stalker.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/stalker.dm @@ -7,7 +7,7 @@ icon_dead = "stalker-dead" icon_living = "stalker" icon_state = "stalker" - icon_rest = "stalker_rest" //CHOMPS EDIT + icon_rest = "stalker_rest" faction = FACTION_STALKER old_x = -16 old_y = 0 diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/swoopie.dm b/code/modules/mob/living/simple_mob/subtypes/vore/swoopie.dm similarity index 98% rename from modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/swoopie.dm rename to code/modules/mob/living/simple_mob/subtypes/vore/swoopie.dm index 3cf32e8875..f4f5ac35a5 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/swoopie.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/swoopie.dm @@ -26,7 +26,7 @@ icon_living = "swoopie" icon_dead = "swoopie_dead" icon_rest = "swoopie_rest" - icon = 'modular_chomp/icons/mob/vore64x64_ch.dmi' + icon = 'icons/mob/vore64x64.dmi' vis_height = 64 has_eye_glow = TRUE custom_eye_color = "#00CC00" @@ -85,9 +85,7 @@ . = ..() //if not vaccable, just do what it normally does /mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/load_default_bellies() - add_verb(src,/mob/living/proc/eat_trash) //CHOMPEdit TGPanel - add_verb(src,/mob/living/proc/toggle_trash_catching) //CHOMPEdit TGPanel - add_verb(src,/mob/living/proc/restrict_trasheater) //CHOMPEdit TGPanel + add_verb(src,/mob/living/proc/restrict_trasheater) var/obj/belly/B = new /obj/belly(src) B.affects_vore_sprites = TRUE B.belly_sprite_to_affect = "stomach" @@ -328,7 +326,7 @@ /obj/item/vac_attachment/swoopie name = "Swoopie Vac-Beak" desc = "Useful for slurping mess off the floors. Even dirt and pests depending on settings. This vaccum seems to be permanantly attached to the swoopie's rumbling rubber trashbag." - icon = 'modular_chomp/icons/mob/vacpack_swoop.dmi' + icon = 'icons/mob/vacpack_swoop.dmi' item_state = null /obj/item/vac_attachment/swoopie/dropped(mob/user) //This should fix it sitting on the ground until the next life() tick diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore_hostile.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore_hostile.dm index f06494cdf2..091e59cad8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/vore_hostile.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore_hostile.dm @@ -76,7 +76,6 @@ B.name = "interior" B.desc = "It's hot and overwhelmingly tight! The interior of the pale creature groans with the effort of squeezing you. Everything is hot and churning and eager to grind and smother you in thick fluids. The weight of the creature's body pressing in at you makes it hard to move at all, while you are squeezed to the very core of the creature! There seems almost not to even be an organ for this so much as the creature has folded around you, trying to incorporate your matter into its body with vigor!" B.mode_flags = DM_FLAG_THICKBELLY | DM_FLAG_NUMBING -// B.belly_fullscreen = "yet_another_tumby" //Chompedit - Belly Fullscreen change B.digest_brute = 3 B.digest_burn = 2 B.digestchance = 0 @@ -194,7 +193,6 @@ B.name = "stomach" B.desc = "The flesh of the tall creature's stomach folds over you in doughy waves, squeezing you into the tightest shape it can manage with idle flexes churning down on you. Your limbs often find themselves lost between folds and tugged this way or that, held in a skin tight press that is not painful, but is hard to pull away from. You can see a strange, glittering pink and purple light glimmering through the flesh of the monster all around you, like your very own sea of stars. The walls rush in to fill all the space, squeezing you from head to toe no matter how you might wiggle, the weight of the semi-transparent interior flesh keeping you neatly secured deep inside while wringing the fight out of you." B.mode_flags = DM_FLAG_THICKBELLY | DM_FLAG_NUMBING -// B.belly_fullscreen = "yet_another_tumby" //Chompedit - Belly Fullscreen change B.digest_brute = 2 B.digest_burn = 2 B.digestchance = 0 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/weretiger.dm b/code/modules/mob/living/simple_mob/subtypes/vore/weretiger.dm index 2908b17a65..e67cb25378 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/weretiger.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/weretiger.dm @@ -31,7 +31,7 @@ has_hands = 1 - can_be_drop_prey = FALSE //CHOMP Add + can_be_drop_prey = FALSE allow_mind_transfer = TRUE // Nomnomn diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm b/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm index fa2c74d85d..1ca318f339 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm @@ -117,6 +117,7 @@ riding_datum = new /datum/riding/simple_mob(src) add_verb(src, /mob/living/simple_mob/proc/animal_mount) add_verb(src, /mob/living/proc/toggle_rider_reins) + add_verb(src,/mob/living/simple_mob/proc/pick_color) movement_cooldown = -1 /mob/living/simple_mob/vore/wolf/direwolf/MouseDrop_T(mob/living/M, mob/living/user) @@ -147,7 +148,7 @@ icon_state = "direwolfs" icon_rest = "direwolfs_rest" -/* //ChompEDIT START - disable unique user-related content +/* CHOMPRemove Start - disable unique user-related content /mob/living/simple_mob/vore/wolf/direwolf/rykka name = "Rykka" desc = "This big canine looks like a GSD. It has a collar tagged, 'Bitch'" @@ -181,6 +182,7 @@ vore_pounce_maxhealth = 100 vore_stomach_name = "Gut" vore_stomach_flavor = "A black-and-purple veined gut, pulsing warmly around you. Loud gurgles sound around you as the gut squishes inwards and attempts to crush you - Rykka seems intent on digesting you, like the meat you are." +*/// CHOMPRemove End /mob/living/simple_mob/vore/wolf/direwolf/andrews name = "andrewsarchus" @@ -193,4 +195,3 @@ icon_rest = "andrews_rest" mount_offset_y = 17 -*/ //ChompEDIT END diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/wolftaur.dm b/code/modules/mob/living/simple_mob/subtypes/vore/wolftaur.dm index e7f2ddb088..6bac3df0cd 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/wolftaur.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/wolftaur.dm @@ -74,7 +74,6 @@ B.name = "stomach" B.desc = "After a gruelling compressive traversal down through the taur's gullet, you briefly get deposited in an oppressively tight stomach at it's humanoid waist. However, the wolf has little interest in keeping you here, instead treating you as a mere snack, an orifice opens beneath you and you're soon dragged deeper into her depths. Soon you're splashing into an active, waiting caustic slurry, and the world around you drops as though you're trapped in a hammock. The taur's underbelly sags with your weight, and you feel a heavy pat from the woman outside settling in to make the most of her meal." B.mode_flags = DM_FLAG_THICKBELLY -// B.belly_fullscreen = "yet_another_tumby" //Chompedit - Belly Fullscreen change B.digest_brute = 2 B.digest_burn = 2 B.digest_oxy = 1 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm index e46088f18b..869b9953bf 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm @@ -215,11 +215,9 @@ response_disarm = "gently pushes aside" response_harm = "hits" -// Chomp EDIT /mob/living/simple_mob/hostile/carp/pike vore_active = 1 // NO VORE SPRITES -// Chomp EDIT END /mob/living/simple_mob/animal/space/carp/holographic vore_icons = 0 // NO VORE SPRITES diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 2ea226afe9..e1df96bc13 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -46,7 +46,7 @@ . += "Time To Start: Server Initializing" else if(SSticker.current_state == GAME_STATE_PREGAME) - . += "Time To Start: [round(SSticker.timeLeft, 1)][GLOB.round_progressing ? "" : " (DELAYED)"]" + . += "Time To Start: [round(SSticker.timeLeft / 10, 1)][GLOB.round_progressing ? "" : " (DELAYED)"]" . += "Players: [totalPlayers]" . += "Players Ready: [totalPlayersReady]" totalPlayers = 0 diff --git a/code/modules/organs/internal/_organ_internal.dm b/code/modules/organs/internal/_organ_internal.dm index 47f04876c5..6c66547054 100644 --- a/code/modules/organs/internal/_organ_internal.dm +++ b/code/modules/organs/internal/_organ_internal.dm @@ -4,12 +4,12 @@ /obj/item/organ/internal var/dead_icon // Icon to use when the organ has died. - var/supply_conversion_value = 0 //CHOMPedit Selling Engineered Organs + var/supply_conversion_value = 0 -/obj/item/organ/internal/Initialize(mapload, internal) //CHOMPEdit Start - Selling Engineered Organs +/obj/item/organ/internal/Initialize(mapload, internal) . = ..() if(supply_conversion_value) - AddElement(/datum/element/sellable/organ) //CHOMPEdit End - Selling Engineered Organs + AddElement(/datum/element/sellable/organ) /obj/item/organ/internal/die() ..() diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 8cd0d36884..8cff0f5e00 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -471,3 +471,18 @@ force = 12 accuracy = 0 scoped_accuracy = 20 + +/obj/item/gun/energy/zip + name = "Zip-Las" + desc = "A homemade (and somehow safe) laser gun designed around shooting single powerful laser beam draining the cell entirely. Better not miss and better have spare cells." + icon = 'icons/obj/gun.dmi' + icon_state = "ziplas" + item_state = "ziplas" + w_class = ITEMSIZE_SMALL + slot_flags = SLOT_BELT|SLOT_BACK + charge_cost = 1500 //You got 1 shot... + projectile_type = /obj/item/projectile/beam/heavylaser //But it hurts a lot + cell_type = /obj/item/cell/device/weapon + +/obj/item/gun/energy/zip/craftable + battery_lock = 1 //makeshift gun has flaws diff --git a/code/modules/projectiles/guns/energy/laser_ch.dm b/code/modules/projectiles/guns/energy/laser_ch.dm index efa83c956a..f00e7c6739 100644 --- a/code/modules/projectiles/guns/energy/laser_ch.dm +++ b/code/modules/projectiles/guns/energy/laser_ch.dm @@ -101,18 +101,6 @@ list(mode_name="short bursts", burst=5, fire_delay=10 ,move_delay=6, burst_accuracy = list(65,65,65,65,65), dispersion = list(4,4,4,4,4)), ) -/obj/item/gun/energy/zip - name = "Zip-Las" - desc = "A homemade (and somehow safe) laser gun designed around shooting single powerful laser beam draining the cell entirely. Better not miss and better have spare cells." - icon = 'icons/obj/gun_ch.dmi' - icon_state = "ziplas" - item_state = "ziplas" - w_class = ITEMSIZE_SMALL - slot_flags = SLOT_BELT|SLOT_BACK - charge_cost = 1500 //You got 1 shot... - projectile_type = /obj/item/projectile/beam/heavylaser //But it hurts a lot - cell_type = /obj/item/cell/device/weapon - /obj/item/gun/energy/vepr/plasma name = "WKHM 'Vepr-Prisma'" desc = "The Vepr-Prisma plasma rifle, in 40 Watt range. A very robust version of the Vepr lasrifle, made to fire energized bolts of plasma. The Vepr-Prisma is very uncommon, reserved mainly for W-K's internal security forces, and organizations with lots of money to spend. Lacks a burst mode, but it probably doesn't need it. This one bears the 'WKHM Adamant' arkship's production stamp." diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index cbfbd1bac1..f08afa01bb 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -99,6 +99,21 @@ armor_penetration = 15 hud_state = "pistol_light_ap" +/obj/item/projectile/bullet/pistol/medium/ap/suppressor // adminspawn only + name = "suppressor bullet" // this guy is Important and also Hates You + fire_sound = 'sound/weapons/doompistol.ogg' // converted from .wavs extracted from doom 2 + damage = 10 // high rof kinda fucked up lets be real + agony = 10 // brute easily heals, agony not so much + armor_penetration = 30 // reduces shield blockchance + accuracy = -20 // he do miss actually + speed = 0.4 // if the pathfinder gets a funny burst rifle, they deserve a rival + // that's 2x projectile speed btw + hud_state = "monkey" + +/obj/item/projectile/bullet/pistol/medium/ap/suppressor/turbo // spicy boys + speed = 0.2 // this is 4x projectile speed + hud_state = "monkey" + /obj/item/projectile/bullet/pistol/medium/hp damage = 30 armor_penetration = -50 diff --git a/code/modules/projectiles/projectile/bullets_ch.dm b/code/modules/projectiles/projectile/bullets_ch.dm index fd4e712725..a062046484 100644 --- a/code/modules/projectiles/projectile/bullets_ch.dm +++ b/code/modules/projectiles/projectile/bullets_ch.dm @@ -557,18 +557,3 @@ only use the hollow_point and armor_penetration values.*/ /obj/item/projectile/bullet/gyro old_bullet_act = TRUE - -/obj/item/projectile/bullet/pistol/medium/ap/suppressor // adminspawn only - name = "suppressor bullet" // this guy is Important and also Hates You - fire_sound = 'sound/weapons/doompistol.ogg' // converted from .wavs extracted from doom 2 - damage = 10 // high rof kinda fucked up lets be real - agony = 10 // brute easily heals, agony not so much - armor_penetration = 30 // reduces shield blockchance - accuracy = -20 // he do miss actually - speed = 0.4 // if the pathfinder gets a funny burst rifle, they deserve a rival - // that's 2x projectile speed btw - hud_state = "monkey" - -/obj/item/projectile/bullet/pistol/medium/ap/suppressor/turbo // spicy boys - speed = 0.2 // this is 4x projectile speed - hud_state = "monkey" diff --git a/code/modules/reagents/reactions/instant/instant.dm b/code/modules/reagents/reactions/instant/instant.dm index 2f19ce1b41..1e1c5af296 100644 --- a/code/modules/reagents/reactions/instant/instant.dm +++ b/code/modules/reagents/reactions/instant/instant.dm @@ -1494,3 +1494,10 @@ /decl/chemical_reaction/instant/potato_juice_metal_paint/send_data() return "#2e2a21" + +/decl/chemical_reaction/instant/aphrodisiac + name = REAGENT_APHRODISIAC + id = REAGENT_ID_APHRODISIAC + result = REAGENT_ID_APHRODISIAC + required_reagents = list(REAGENT_ID_CARBON = 2, REAGENT_ID_HYDROGEN = 2, REAGENT_ID_OXYGEN = 2, REAGENT_ID_WATER = 1) + result_amount = 6 diff --git a/code/modules/reagents/reactions/instant/instant_ch.dm b/code/modules/reagents/reactions/instant/instant_ch.dm index 2c0f7fca11..876de0223f 100644 --- a/code/modules/reagents/reactions/instant/instant_ch.dm +++ b/code/modules/reagents/reactions/instant/instant_ch.dm @@ -1,10 +1,3 @@ -/decl/chemical_reaction/instant/aphrodisiac - name = REAGENT_APHRODISIAC - id = REAGENT_ID_APHRODISIAC - result = REAGENT_ID_APHRODISIAC - required_reagents = list(REAGENT_ID_CARBON = 2, REAGENT_ID_HYDROGEN = 2, REAGENT_ID_OXYGEN = 2, REAGENT_ID_WATER = 1) - result_amount = 6 - /decl/chemical_reaction/instant/claridyl name = REAGENT_CLARIDYL id = REAGENT_ID_CLARIDYL diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index ae93eadf5f..c358f964dc 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -288,7 +288,7 @@ var/obj/item/organ/external/affecting = H.get_organ(target_zone) if (!affecting || affecting.is_stump()) - balloon_alert(user, "they are missing that limb!") // CHOMPEdit - Changed to balloon_alert + balloon_alert(user, "they are missing that limb!") return var/hit_area = affecting.name diff --git a/code/modules/reagents/reagents/dispenser.dm b/code/modules/reagents/reagents/dispenser.dm index 2a005ce12f..7ac7265738 100644 --- a/code/modules/reagents/reagents/dispenser.dm +++ b/code/modules/reagents/reagents/dispenser.dm @@ -705,3 +705,13 @@ color = "#efe9ca" supply_conversion_value = 0.5 SHEET_TO_REAGENT_EQUIVILENT // has sheet value industrial_use = REFINERYEXPORT_REASON_PRECURSOR + +/datum/reagent/miasma + name = REAGENT_MIASMA + id = REAGENT_ID_MIASMA + description = "Not necessarily a gas, miasma refers to biological pollutants found in the atmosphere." + reagent_state = GAS + taste_description = "indescribable" + color = "#808000" + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD diff --git a/code/modules/reagents/reagents/food_drinks.dm b/code/modules/reagents/reagents/food_drinks.dm index 0ba3e656ba..6fdc8a7a98 100644 --- a/code/modules/reagents/reagents/food_drinks.dm +++ b/code/modules/reagents/reagents/food_drinks.dm @@ -5132,3 +5132,14 @@ supply_conversion_value = REFINERYEXPORT_VALUE_UNWANTED industrial_use = REFINERYEXPORT_REASON_FOOD + + +/datum/reagent/drink/teamush + name = REAGENT_TEAMUSH + id = REAGENT_ID_TEAMUSH + description = "Mashed tea leaves, a bit like grass clippings. You can't make proper tea out of this now." + taste_description = "overwhelmingly bitter plant" + color = "#7db72d" + + glass_name = "blended plant" + glass_desc = "Chunky, mashed up plant of some sort. Looks kinda gross." diff --git a/code/modules/reagents/reagents/other.dm b/code/modules/reagents/reagents/other.dm index d96a376cca..f5fe6fa8f5 100644 --- a/code/modules/reagents/reagents/other.dm +++ b/code/modules/reagents/reagents/other.dm @@ -850,3 +850,12 @@ color = "#e8e2b0" supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED industrial_use = REFINERYEXPORT_REASON_PRECURSOR + +/datum/reagent/nutriment/pitcher_nectar //Pitcher plant reagent, doubles plant growth speed. + name = REAGENT_ID_PITCHERNECTAR + id = REAGENT_ID_PITCHERNECTAR + description = "An odd, sticky slurry which promotes rapid plant growth." + taste_description = "pineapple" + reagent_state = LIQUID + nutriment_factor = 60 + color = "#a839a2" diff --git a/code/modules/reagents/reagents/other_ch.dm b/code/modules/reagents/reagents/other_ch.dm index a8d83fc23e..e6e96e364c 100644 --- a/code/modules/reagents/reagents/other_ch.dm +++ b/code/modules/reagents/reagents/other_ch.dm @@ -38,15 +38,6 @@ if(O) O.implants += spiderling -/datum/reagent/nutriment/pitcher_nectar //Pitcher plant reagent, doubles plant growth speed. - name = REAGENT_ID_PITCHERNECTAR - id = REAGENT_ID_PITCHERNECTAR - description = "An odd, sticky slurry which promotes rapid plant growth." - taste_description = "pineapple" - reagent_state = LIQUID - nutriment_factor = 60 - color = "#a839a2" - //New reagent definitions/overrides. If some of these get added upstream and cause a conflict later they might need deleting. /datum/reagent/toxin/plantbgone/touch_mob(var/mob/living/L, amount) //Plantbgone override to damage plant mobs. Part of pitcher plants, touch_mob doesn't exist for plantbgone at the time of writing. if(istype(L) && L.faction) diff --git a/code/modules/reagents/reagents/vore_ch.dm b/code/modules/reagents/reagents/vore_ch.dm index d877dea769..ffbba0be6b 100644 --- a/code/modules/reagents/reagents/vore_ch.dm +++ b/code/modules/reagents/reagents/vore_ch.dm @@ -1,23 +1,4 @@ //Vore/kink reagents go here. - -/datum/reagent/aphrodisiac - name = REAGENT_APHRODISIAC - id = REAGENT_ID_APHRODISIAC - description = "You so horny." - taste_description = "sweetness" - reagent_state = LIQUID - color = "#FF9999" - scannable = 1 - supply_conversion_value = REFINERYEXPORT_VALUE_RARE - industrial_use = REFINERYEXPORT_REASON_DRUG - - -/datum/reagent/aphrodisiac/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(!M) return - - if(prob(3)) - M.emote(pick("blush", "moan", "moan", "giggle")) - /datum/reagent/sorbitol name = REAGENT_SORBITOL id = REAGENT_ID_SORBITOL diff --git a/code/modules/reagents/reagents/vore_vr.dm b/code/modules/reagents/reagents/vore_vr.dm index b5c1ea5acc..47bf1787da 100644 --- a/code/modules/reagents/reagents/vore_vr.dm +++ b/code/modules/reagents/reagents/vore_vr.dm @@ -274,3 +274,21 @@ M.add_chemical_effect(CE_PAINKILLER, -200) if(prob(0.01)) //1 in 10000 chance per tick. Extremely rare. to_chat(M,span_warning("Your body feels as though it's on fire!")) + +/datum/reagent/aphrodisiac + name = REAGENT_APHRODISIAC + id = REAGENT_ID_APHRODISIAC + description = "You so horny." + taste_description = "sweetness" + reagent_state = LIQUID + color = "#FF9999" + scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_DRUG + + +/datum/reagent/aphrodisiac/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(!M) return + + if(prob(3)) + M.emote(pick("blush", "moan", "moan", "giggle")) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 0a79cbad5b..b96b2c10db 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -337,7 +337,6 @@ playsound(src, I.usesound, 50, 1) return - //Ports making conveyors fast from CHOMPstation if(I.has_tool_quality(TOOL_WIRECUTTER)) toggle_speed() to_chat(user, "You adjust the speed of the conveyor switch") diff --git a/modular_chomp/code/modules/salvage/bags.dm b/code/modules/salvage/bags.dm similarity index 100% rename from modular_chomp/code/modules/salvage/bags.dm rename to code/modules/salvage/bags.dm diff --git a/modular_chomp/code/modules/salvage/salvage.dm b/code/modules/salvage/salvage.dm similarity index 94% rename from modular_chomp/code/modules/salvage/salvage.dm rename to code/modules/salvage/salvage.dm index 00744d81a8..88839cc963 100644 --- a/modular_chomp/code/modules/salvage/salvage.dm +++ b/code/modules/salvage/salvage.dm @@ -1,7 +1,7 @@ /obj/item/salvage name = "salvage" desc = "A tonne of salvage from bad mapping practices. Who spawned the base type? Report this on GitHub" - icon = 'modular_chomp/icons/obj/salvage/sellable.dmi' + icon = 'icons/obj/salvage/sellable.dmi' force = 5 throwforce = 5 throw_speed = 1 @@ -11,10 +11,10 @@ w_class = ITEMSIZE_NORMAL var/worth = 100 -/obj/item/salvage/Initialize(mapload) //CHOMPEdit Start - Selling Salvage +/obj/item/salvage/Initialize(mapload) . = ..() if(worth) - AddElement(/datum/element/sellable/salvage) //CHOMPEdit End - Selling Salvage + AddElement(/datum/element/sellable/salvage) /obj/item/salvage/examine(mob/user) . = ..() diff --git a/code/modules/vore/eating/belly_import.dm b/code/modules/vore/eating/belly_import.dm index 500a38b441..7303f5945f 100644 --- a/code/modules/vore/eating/belly_import.dm +++ b/code/modules/vore/eating/belly_import.dm @@ -495,7 +495,7 @@ var/new_emote_time = belly_data["emote_time"] new_belly.emote_time = CLAMP(new_emote_time, 60, 600) - new_belly.set_zero_digestion_damage() // Not implemented on virgo; CHOMPEnale needed for importing a belly to overwrite an existing belly; otherwise pre-existing values throw off the unused digestion damage. + new_belly.set_zero_digestion_damage() // Needed for importing a belly to overwrite an existing belly; otherwise pre-existing values throw off the unused digestion damage. if(isnum(belly_data["digest_brute"])) var/new_digest_brute = belly_data["digest_brute"] @@ -1192,7 +1192,7 @@ // After import updates new_belly.items_preserved.Cut() - new_belly.update_internal_overlay() // Signal not implemented! CHOMPEnable + new_belly.update_internal_overlay() host.handle_belly_update() host.updateVRPanel() diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 8500e07461..af95b6383e 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -1090,6 +1090,9 @@ //Incase they have the loop going, let's double check to stop it. M.stop_sound_channel(CHANNEL_PREYLOOP) + //Don't let glows stick + M.glow_toggle = FALSE + M.set_light(0) // Delete the digested mob // Changed qdel to a forceMove to allow reforming, and... handled robots special. if(isrobot(M)) diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/code/modules/vore/eating/simple_animal_vr.dm index 8f37288e05..f6356c92b3 100644 --- a/code/modules/vore/eating/simple_animal_vr.dm +++ b/code/modules/vore/eating/simple_animal_vr.dm @@ -58,12 +58,7 @@ if(!vore_selected) to_chat(user, span_warning("[src] isn't planning on eating anything much less digesting it.")) return -/*ChompStation edit: This prevented some flexibility with mob vore and the returned message was highly unprofessional. - if(ai_holder.retaliate || (ai_holder.hostile && faction != user.faction)) - to_chat(user, span_warning("This predator isn't friendly, and doesn't give a shit about your opinions of it digesting you.")) - return -*/ if(vore_selected.digest_mode == DM_HOLD) var/confirm = tgui_alert(user, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will reset after 20 minutes.", "Enabling [name]'s Digestion", list("Enable", "Cancel")) if(confirm == "Enable") diff --git a/icons/effects/bigdragon_labels_ch.dmi b/icons/effects/bigdragon_labels_ch.dmi deleted file mode 100644 index 8c8ef1ba73..0000000000 Binary files a/icons/effects/bigdragon_labels_ch.dmi and /dev/null differ diff --git a/modular_chomp/icons/effects/goia_labels.dmi b/icons/effects/goia_labels.dmi similarity index 100% rename from modular_chomp/icons/effects/goia_labels.dmi rename to icons/effects/goia_labels.dmi diff --git a/icons/effects/synx_labels_ch.dmi b/icons/effects/synx_labels.dmi similarity index 100% rename from icons/effects/synx_labels_ch.dmi rename to icons/effects/synx_labels.dmi diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index f1d5143b43..759f4489ce 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/construct.dmi b/icons/mob/construct.dmi new file mode 100644 index 0000000000..da978e00b1 Binary files /dev/null and b/icons/mob/construct.dmi differ diff --git a/icons/mob/cultists.dmi b/icons/mob/cultists.dmi new file mode 100644 index 0000000000..c205029de7 Binary files /dev/null and b/icons/mob/cultists.dmi differ diff --git a/icons/mob/cyber_horror.dmi b/icons/mob/cyber_horror.dmi new file mode 100644 index 0000000000..ade922891a Binary files /dev/null and b/icons/mob/cyber_horror.dmi differ diff --git a/modular_chomp/icons/mob/demon_ch_alt.dmi b/icons/mob/demon_alt.dmi similarity index 100% rename from modular_chomp/icons/mob/demon_ch_alt.dmi rename to icons/mob/demon_alt.dmi diff --git a/icons/mob/demon_vr.dmi b/icons/mob/demon_vr.dmi index 5ad0c6e550..0d7b0c27c4 100644 Binary files a/icons/mob/demon_vr.dmi and b/icons/mob/demon_vr.dmi differ diff --git a/modular_chomp/icons/mob/animals48x32_ch.dmi b/icons/mob/hyena.dmi similarity index 100% rename from modular_chomp/icons/mob/animals48x32_ch.dmi rename to icons/mob/hyena.dmi diff --git a/icons/mob/mercenaries.dmi b/icons/mob/mercenaries.dmi new file mode 100644 index 0000000000..0464e45e85 Binary files /dev/null and b/icons/mob/mercenaries.dmi differ diff --git a/icons/mob/mimic.dmi b/icons/mob/mimic.dmi new file mode 100644 index 0000000000..557a4e2589 Binary files /dev/null and b/icons/mob/mimic.dmi differ diff --git a/icons/mob/mouse_army.dmi b/icons/mob/mouse_army.dmi new file mode 100644 index 0000000000..12a3081a37 Binary files /dev/null and b/icons/mob/mouse_army.dmi differ diff --git a/icons/mob/pirates.dmi b/icons/mob/pirates.dmi new file mode 100644 index 0000000000..752c7358d4 Binary files /dev/null and b/icons/mob/pirates.dmi differ diff --git a/icons/mob/possessed.dmi b/icons/mob/possessed.dmi new file mode 100644 index 0000000000..6a4132e3ed Binary files /dev/null and b/icons/mob/possessed.dmi differ diff --git a/modular_chomp/icons/mob/screen1_purity.dmi b/icons/mob/screen1_purity.dmi similarity index 100% rename from modular_chomp/icons/mob/screen1_purity.dmi rename to icons/mob/screen1_purity.dmi diff --git a/icons/mob/screen1_robot_vr.dmi b/icons/mob/screen1_robot_vr.dmi index a2cdb93d8e..a93c549a1d 100644 Binary files a/icons/mob/screen1_robot_vr.dmi and b/icons/mob/screen1_robot_vr.dmi differ diff --git a/icons/mob/snake_vr.dmi b/icons/mob/snake_vr.dmi index 6802aecc47..14e3c055fc 100644 Binary files a/icons/mob/snake_vr.dmi and b/icons/mob/snake_vr.dmi differ diff --git a/modular_chomp/icons/mob/synx_modular.dmi b/icons/mob/synx_modular.dmi similarity index 100% rename from modular_chomp/icons/mob/synx_modular.dmi rename to icons/mob/synx_modular.dmi diff --git a/modular_chomp/icons/mob/vacpack.dmi b/icons/mob/vacpack.dmi similarity index 100% rename from modular_chomp/icons/mob/vacpack.dmi rename to icons/mob/vacpack.dmi diff --git a/modular_chomp/icons/mob/vacpack_swoop.dmi b/icons/mob/vacpack_swoop.dmi similarity index 100% rename from modular_chomp/icons/mob/vacpack_swoop.dmi rename to icons/mob/vacpack_swoop.dmi diff --git a/icons/mob/vore.dmi b/icons/mob/vore.dmi index 3ada420655..5cc4ac91c2 100644 Binary files a/icons/mob/vore.dmi and b/icons/mob/vore.dmi differ diff --git a/icons/mob/vore32x64.dmi b/icons/mob/vore32x64.dmi index 66464ac3c8..5ec6903f27 100644 Binary files a/icons/mob/vore32x64.dmi and b/icons/mob/vore32x64.dmi differ diff --git a/icons/mob/vore64x32.dmi b/icons/mob/vore64x32.dmi index caf7169835..78321eee1f 100644 Binary files a/icons/mob/vore64x32.dmi and b/icons/mob/vore64x32.dmi differ diff --git a/icons/mob/vore64x64.dmi b/icons/mob/vore64x64.dmi index 151210857c..a2e3c264b8 100644 Binary files a/icons/mob/vore64x64.dmi and b/icons/mob/vore64x64.dmi differ diff --git a/modular_chomp/icons/mob/zorgoia64x32.dmi b/icons/mob/zorgoia64x32.dmi similarity index 100% rename from modular_chomp/icons/mob/zorgoia64x32.dmi rename to icons/mob/zorgoia64x32.dmi diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 0809c08585..d83bf81aed 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/gun_ch.dmi b/icons/obj/gun_ch.dmi index e47e40feb1..15bb82b21d 100644 Binary files a/icons/obj/gun_ch.dmi and b/icons/obj/gun_ch.dmi differ diff --git a/icons/obj/salvage/sellable.dmi b/icons/obj/salvage/sellable.dmi new file mode 100644 index 0000000000..96238af046 Binary files /dev/null and b/icons/obj/salvage/sellable.dmi differ diff --git a/modular_chomp/code/datums/crafting/items.dm b/modular_chomp/code/datums/crafting/items.dm index f0f343f704..7390d425ce 100644 --- a/modular_chomp/code/datums/crafting/items.dm +++ b/modular_chomp/code/datums/crafting/items.dm @@ -179,7 +179,7 @@ /obj/item/gun/energy/icelauncher name = "Strange Pistol" desc = "A homemade and somehow functional icicle launcher." - icon = 'icons/obj/gun_ch.dmi' + icon = 'icons/obj/gun.dmi' icon_state = "ziplas" item_state = "ziplas" color = "#0000CC" diff --git a/modular_chomp/code/datums/crafting/recipes.dm b/modular_chomp/code/datums/crafting/recipes.dm index 9f4dd9dcec..ee1f90db08 100644 --- a/modular_chomp/code/datums/crafting/recipes.dm +++ b/modular_chomp/code/datums/crafting/recipes.dm @@ -1,16 +1,3 @@ -/datum/crafting_recipe/ziplaser - name = "Ziplaser" - result = /obj/item/gun/energy/zip/craftable - reqs = list(list(/obj/item/cell/high = 1), - list(/obj/item/stack/rods = 2), - list(/obj/item/stack/material/steel = 8), - list(/obj/item/stack/material/plastic = 5), - list(/obj/item/cell/device = 2) - ) - time = 120 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - /datum/crafting_recipe/primitive_platecarrier name = "primitive plate carrier" result = /obj/item/clothing/suit/armor/pcarrier/primative diff --git a/modular_chomp/code/datums/elements/lootable/mecha.dm b/modular_chomp/code/datums/elements/lootable/mecha.dm index 1c75da0572..c4cde2f454 100644 --- a/modular_chomp/code/datums/elements/lootable/mecha.dm +++ b/modular_chomp/code/datums/elements/lootable/mecha.dm @@ -1,57 +1,3 @@ -// Stuff you may find attached to a mouse tank. -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/element/lootable/mecha/mouse_tank - loot_left= 5 - - common_loot = list( - /obj/random/tool, - /obj/random/tool, - /obj/item/stack/cable_coil/random, - /obj/random/tank, - /obj/random/tech_supply/component, - /obj/random/tech_supply/component, - /obj/effect/decal/remains/mouse, - /obj/item/stack/material/steel{amount = 20} - ) - - uncommon_loot = list( - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rigged, - /obj/item/mecha_parts/mecha_equipment/generator - ) - - rare_loot = list( - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg, - /obj/item/mecha_parts/mecha_equipment/generator/nuclear - ) - -// Stuff you may find attached to a livewire mouse tank. -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/element/lootable/mecha/mouse_tank/livewire - - uncommon_loot = list( - /obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer/rigged, - /obj/item/mecha_parts/mecha_equipment/tool/extinguisher - ) - - rare_loot = list( - /obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer, - /obj/item/mecha_parts/mecha_equipment/generator - ) - -// Stuff you may find attached to a eraticator mouse tank. -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/element/lootable/mecha/mouse_tank/eraticator - - uncommon_loot = list( - /obj/item/ammo_magazine/m75, - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/mortar - ) - - rare_loot = list( - /obj/item/gun/projectile/gyropistol, - /obj/item/mecha_parts/mecha_equipment/generator/nuclear - ) - // Stuff you may find attached to an odd gygax. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /datum/element/lootable/mecha/odd_gygax diff --git a/modular_chomp/code/game/objects/mob_spawner.dm b/modular_chomp/code/game/objects/mob_spawner.dm deleted file mode 100644 index 7e371baa5d..0000000000 --- a/modular_chomp/code/game/objects/mob_spawner.dm +++ /dev/null @@ -1,58 +0,0 @@ -/obj/structure/mob_spawner/scanner/mining_animals - name = "Mining Lazy Spawner" - spawn_delay = 10 MINUTES - range = 10 - simultaneous_spawns = 1 - mob_faction = "wild animal" - total_spawns = 2 - destructible = 0 - anchored = 1 - invisibility = INVISIBILITY_ABSTRACT - spawn_types = list( - /mob/living/simple_mob/vore/bat = 70, - /mob/living/simple_mob/animal/passive/cockroach = 60, - /obj/effect/spider/spiderling/non_growing = 50, - /mob/living/simple_mob/animal/giant_spider/tunneler/cave = 50, - /mob/living/simple_mob/vore/jelly = 40, - /mob/living/simple_mob/vore/aggressive/rat = 30, - /mob/living/simple_mob/animal/passive/mouse = 30, - /mob/living/simple_mob/animal/passive/mouse/rat = 25, - /mob/living/simple_mob/metroid/mine = 25, - /mob/living/simple_mob/vore/oregrub = 25, - /mob/living/simple_mob/vore/aggressive/dino = 20, - /mob/living/simple_mob/animal/space/carp = 20, - /mob/living/simple_mob/vore/oregrub/lava = 15, - /mob/living/simple_mob/vore/stalker = 10, - /mob/living/simple_mob/vore/lamia/copper/cave = 10, - /mob/living/simple_mob/vore/lamia/albino/cave = 5, - /mob/living/simple_mob/vore/aggressive/lizardman = 5, - /mob/living/simple_mob/vore/otie = 5, - /mob/living/simple_mob/animal/passive/pillbug = 5, // These aren't dangerous, but are made rare just because few people are going to bother killing them. - /obj/structure/closet/crate/mimic/cointoss = 1, - /obj/structure/closet/crate/mimic/closet/cointoss = 1, - /mob/living/simple_mob/vore/otie/feral = 1, - // /mob/living/simple_mob/vore/sonadile = 1, // Removed until sprite issues fixed. - /mob/living/simple_mob/animal/space/bear/brown = 1, - /mob/living/simple_mob/vore/aggressive/deathclaw = 1, - /mob/living/simple_mob/vore/gryphon = 1, - /mob/living/simple_mob/vore/demon = 0.5 // VERY rare! - ) - -/obj/structure/mob_spawner/proc/get_used_report(var/obj/structure/closet/crate/mimic/O) - if(O in spawned_mobs) - spawned_mobs.Remove(O) - -/obj/structure/mob_spawner/mouse_nest/mousehole - name = "small hole" - desc = "A small hole, critters seem to move in and out from here." - icon = 'icons/effects/effects.dmi' - icon_state = "tunnel_hole" - spawn_types = list( - /mob/living/simple_mob/animal/passive/mouse = 100, - /mob/living/simple_mob/animal/passive/cockroach = 25, - /mob/living/simple_mob/animal/passive/mouse/rat/strong = 10, // Because I'm a horrible person. <3 - /obj/effect/spider/spiderling/non_growing = 5) - -/obj/structure/mob_spawner/mouse_nest/mousehole/Initialize(mapload) - . = ..() - icon_state = "tunnel_hole" diff --git a/modular_chomp/code/game/objects/structures/loot_pile.dm b/modular_chomp/code/game/objects/structures/loot_pile.dm index ee1d338a9c..a9f510ff88 100644 --- a/modular_chomp/code/game/objects/structures/loot_pile.dm +++ b/modular_chomp/code/game/objects/structures/loot_pile.dm @@ -1,34 +1,5 @@ -//Micro mecha loot. -/obj/structure/loot_pile/mecha/mouse_tank - name = "\improper Whisker wreckage" - desc = "The ruins of a small tank. Perhaps some child's toy?" - icon = 'modular_chomp/icons/mob/animal_ch.dmi' - icon_state = "whisker-broken" - density = TRUE - anchored = FALSE // In case a dead mecha-mob dies in a bad spot. - - loot_element_path = /datum/element/lootable/mecha/mouse_tank - -/obj/structure/loot_pile/mecha/mouse_tank/livewire - name = "\improper Livewire wreckage" - desc = "The smoldering ruins of a small tank. Perhaps some child's toy?" - icon_state = "livewire-broken" - density = TRUE - anchored = FALSE // In case a dead mecha-mob dies in a bad spot. - - loot_element_path = /datum/element/lootable/mecha/mouse_tank/livewire - -/obj/structure/loot_pile/mecha/mouse_tank/eraticator - name = "\improper Eraticator wreckage" - desc = "The blasted ruins of a small tank. Perhaps some child's toy?" - icon_state = "eraticator-broken" - density = TRUE - anchored = FALSE // In case a dead mecha-mob dies in a b - - loot_element_path = /datum/element/lootable/mecha/mouse_tank/eraticator - /obj/structure/loot_pile/mecha/ripley/pirate - icon = 'modular_chomp/icons/mob/animal_ch.dmi' + icon = 'icons/mob/pirates.dmi' icon_state = "pirate-broken" /obj/structure/loot_pile/maint/technical diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/animal/spider.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/animal/spider.dm index 3b7279deaa..96375641bc 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/animal/spider.dm +++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/animal/spider.dm @@ -197,18 +197,3 @@ min_oxy = 0 max_tox = 0 max_co2 = 0 - -/mob/living/simple_mob/animal/giant_spider/tunneler/cave - name = "cave spider" - desc = "Sandy and brown, it makes you shudder to look at it. However, this one doesn't seem very interested in bothering you." - maxHealth = 25 - health = 25 - harm_intent_damage = 5 - melee_damage_lower = 5 - melee_damage_upper = 5 - ai_holder_type = /datum/ai_holder/simple_mob/retaliate - meat_amount = 1 // Scrawny little things! It's no wonder they don't want to fight you! - -/mob/living/simple_mob/animal/giant_spider/tunneler/cave/Initialize(mapload) - . = ..() - resize(0.50) diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/occult/constructs/construct.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/occult/constructs/construct.dm deleted file mode 100644 index c87ba997a8..0000000000 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/occult/constructs/construct.dm +++ /dev/null @@ -1,27 +0,0 @@ -/mob/living/simple_mob/construct/artificer/caster - projectiletype = /obj/item/projectile/energy/inversion -/* Combat refactor walkback -/mob/living/simple_mob/construct/artificer - maxHealth = 50 - health = 50 - melee_damage_lower = 7 - melee_damage_upper = 10 - -/mob/living/simple_mob/construct/harvester - maxHealth = 50 - health = 50 - melee_damage_lower = 10 - melee_damage_upper = 12 - -/mob/living/simple_mob/construct/wraith - maxHealth = 100 - health = 100 - melee_damage_lower = 12 - melee_damage_upper = 15 - -/mob/living/simple_mob/construct/harvester/greater - maxHealth = 50 - health = 50 - melee_damage_lower = 20 - melee_damage_upper = 25 -*/ diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/occult/constructs/juggernaut.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/occult/constructs/juggernaut.dm deleted file mode 100644 index b7318034ec..0000000000 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/occult/constructs/juggernaut.dm +++ /dev/null @@ -1,52 +0,0 @@ -/* Combat refactor walkback -/mob/living/simple_mob/construct/juggernaut - maxHealth = 100 - health = 100 - melee_damage_lower = 15 - melee_damage_upper = 20 - -/mob/living/simple_mob/construct/juggernaut/behemoth - maxHealth = 300 - health = 300 -*/ -/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable - name = "Behemoth" - real_name = "Behemoth" - desc = "The pinnacle of occult technology, Behemoths are nothing shy of both an Immovable Object, and Unstoppable Force." - melee_damage_lower = 45 - melee_damage_upper = 65 - ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax - projectiletype = /obj/item/projectile/energy/inversion - movement_cooldown = 1 - - loot_list = list(/obj/item/rig/ch/aegis = 100) - - -/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable/bullet_act(var/obj/item/projectile/P) - var/reflectchance = 100 - round(P.damage*2) - if(prob(reflectchance)) - visible_message(span_danger("The [P.name] gets reflected by [src]'s shell!"), \ - span_userdanger("The [P.name] gets reflected by [src]'s shell!")) - - // Find a turf near or on the original location to bounce to - if(P.starting) - var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) - var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) - var/turf/curloc = get_turf(src) - - // redirect the projectile - P.redirect(new_x, new_y, curloc, src) - P.reflected = 1 - - return -1 // complete projectile permutation - - return (..(P)) - - -/obj/item/projectile/energy/electrode/cult - color = "#FFFFFF" - agony = 0 - damage = 15 - damage_type = BURN - check_armour = "laser" - armor_penetration = 60 diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/occult/constructs/purity_construct.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/occult/constructs/purity_construct.dm deleted file mode 100644 index 0118871836..0000000000 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/occult/constructs/purity_construct.dm +++ /dev/null @@ -1,272 +0,0 @@ -//////////////////////////// -// Purity Construct - Laity -//////////////////////////// - -/mob/living/simple_mob/construct/laity //Weak Swarm Attacker can be safely dumped on players in large numbers without too many injuries - name = "Laity" - real_name = "Laity" - construct_type = "Laity" - faction = "purity" - desc = "A small construct of the purity worshippers mechanical followers, not hardy or particularly strong, very numerous." - icon_state = "laity" - icon_living = "laity" - ui_icons = 'modular_chomp/icons/mob/screen1_purity.dmi' - maxHealth = 75 - health = 75 - response_harm = "viciously beaten" - harm_intent_damage = 5 - melee_damage_lower = 4 //It's not the strongest of the bunch, but that doesn't mean it can't hurt you. - melee_damage_upper = 8 - attack_armor_pen = 50 // Does so little damage already, that this can be justified. - attacktext = list("rammed") - attack_sound = 'sound/weapons/rapidslice.ogg' - movement_cooldown = 0 - - ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative - -//////////////////////////// -// Purity Construct - Deacon -//////////////////////////// - -/mob/living/simple_mob/construct/deacon - name = "Deacon" - real_name = "Deacon" - construct_type = "Deacon" - faction = "purity" - desc = "A small construct of the purity worshippers mechanical followers, hardy but mostly harmless." - icon_state = "deacon" - icon_living = "deacon" - ui_icons = 'modular_chomp/icons/mob/screen1_purity.dmi' - maxHealth = 150 - health = 150 - melee_damage_lower = 8 //not meant for combat but can hold its own in a pinch - melee_damage_upper = 12 - attack_armor_pen = 60 //used to carve stone and other metals, cuts through armor just as well - attack_sharp = 1 - attack_edge = 1 - attacktext = list("violently stabbed") - friendly = list("caresses") - organ_names = /decl/mob_organ_names/harvester - movement_cooldown = -1 - - ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative - - // environment_smash = 1 // Whatever this gets renamed to, Harvesters need to break things - - attack_sound = 'sound/weapons/pierce.ogg' - - armor = list( - "melee" = 20, - "bullet" = 10, - "laser" = 10, - "energy" = 10, - "bomb" = 10, - "bio" = 100, - "rad" = 100) - - construct_spells = list( - /spell/aoe_turf/knock/harvester, - /spell/targeted/construct_advanced/force_beam, - /spell/targeted/construct_advanced/soothing_sphere, - ) - -/decl/mob_organ_names/harvester - hit_zones = list("cephalothorax", "eye", "carapace", "energy crystal", "mandible") - -//////////////////////////// -// Purity Construct - Priest -//////////////////////////// - -/mob/living/simple_mob/construct/priest - name = "Priest" - real_name = "Priest" - construct_type = "Priest" - faction = "purity" - desc = "A medium sized construct of the purity worshippers mechanical followers, sturdy but lacking strength." - icon_state = "priest" - icon_living = "priest" - ui_icons = 'modular_chomp/icons/mob/screen1_purity.dmi' - maxHealth = 200 - health = 200 - response_harm = "viciously beaten" - harm_intent_damage = 5 - melee_damage_lower = 10 //It's not the strongest of the bunch, but that doesn't mean it can't hurt you. - melee_damage_upper = 15 - organ_names = /decl/mob_organ_names/artificer - attacktext = list("rammed") - attack_sound = 'sound/weapons/rapidslice.ogg' - construct_spells = list(/spell/targeted/purity_repair_aura, - /spell/targeted/construct_advanced/mend_purity - ) - - ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative - -/decl/mob_organ_names/artificer - hit_zones = list("body", "carapace", "right manipulator", "left manipulator", "upper left appendage", "upper right appendage", "eye") - -//////////////////////////// -// Purity Construct - Bishop -//////////////////////////// - -/mob/living/simple_mob/construct/bishop - name = "Bishop" - real_name = "Bishop" - construct_type = "Bishop" - faction = "purity" - desc = "A medium sized construct of the purity worshippers mechanical followers, sturdy and deadly, these constructs are commanded by an archbishop, tasked with patrolling and eliminating threats to their flock." - icon_state = "bishop" - icon_living = "bishop" - ui_icons = 'modular_chomp/icons/mob/screen1_purity.dmi' - maxHealth = 250 - health = 250 - melee_damage_lower = 15 - melee_damage_upper = 20 - attack_armor_pen = 15 - attack_sharp = TRUE - attack_edge = 1 - attacktext = list("slashed") - friendly = list("pinches") - organ_names = /decl/mob_organ_names/wraith - movement_cooldown = -1 - attack_sound = 'sound/weapons/rapidslice.ogg' - construct_spells = list(/spell/targeted/construct_advanced/crippling_beam, - /spell/targeted/construct_advanced/banishment - ) - - ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative - -// environment_smash = 1 // Whatever this gets renamed to, Wraiths need to break things - -/mob/living/simple_mob/construct/bishop/apply_melee_effects(var/atom/A) - if(isliving(A)) - var/mob/living/L = A - L.add_modifier(/datum/modifier/deep_wounds, 30 SECONDS) - -/decl/mob_organ_names/wraith - hit_zones = list("body", "eye", "crystaline spike", "left claw", "right claw") - -//////////////////////////// -// Purity Construct - Archbishop -//////////////////////////// - -/mob/living/simple_mob/construct/bishop/arch - name = "Archbishop" - real_name = "Archbishop" - construct_type = "Archbishop" - faction = "purity" - desc = "A large sized construct of the purity worshippers mechanical followers, one of their most advanced, it is the right hand of purification, dedicated to the pursuit of eradicating those who cause harm their charge." - icon_state = "archbishop" - icon_living = "archbishop" - ui_icons = 'modular_chomp/icons/mob/screen1_purity.dmi' - maxHealth = 200 - health = 200 - melee_damage_lower = 20 //hits much harder then most purity constructs - melee_damage_upper = 30 - attack_armor_pen = 50 //armor is no match against its religious wrath - attack_sharp = 1 - attack_edge = 1 - attacktext = list("violently stabbed") - friendly = list("caresses") - organ_names = /decl/mob_organ_names/wraith - movement_cooldown = 0 - - ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative - - // environment_smash = 1 // Whatever this gets renamed to, Harvesters need to break things - - attack_sound = 'sound/weapons/pierce.ogg' - -/decl/mob_organ_names/wraith - hit_zones = list("body", "eye", "crystaline spike", "left claw", "right claw") - -//////////////////////////// -// Purity Construct - Cardinal -//////////////////////////// - -/mob/living/simple_mob/construct/cardinal - name = "Cardinal" - real_name = "Cardinal" - construct_type = "Cardinal" - faction = "purity" - desc = "A large sized construct of the purity worshippers mechanical followers, one of their most advanced, it is the left hand of purification, tasked with the ultimate protection and ultimately defense of all under its charge, it will stop at nothing to protect its flock from harm." - icon_state = "cardinal" - icon_living = "cardinal" - ui_icons = 'modular_chomp/icons/mob/screen1_purity.dmi' - maxHealth = 300 - health = 300 - response_harm = "harmlessly punches" - harm_intent_damage = 0 - melee_damage_lower = 20 - melee_damage_upper = 30 - attack_armor_pen = 50 //fist of iron and stone will smash through most things - attacktext = list("smashed their armoured gauntlet into") - friendly = list("pats") - organ_names = /decl/mob_organ_names/juggernaut - mob_size = MOB_HUGE - attack_sound = 'sound/weapons/heavysmash.ogg' - status_flags = 0 - resistance = 10 - construct_spells = list(/spell/targeted/fortify, - /spell/targeted/construct_advanced/slam, - /spell/targeted/construct_advanced/mend_purity, - /spell/targeted/purity_repair_aura - ) - - ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative - - armor = list( - "melee" = 70, - "bullet" = 30, - "laser" = 30, - "energy" = 30, - "bomb" = 10, - "bio" = 100, - "rad" = 100) - -/mob/living/simple_mob/construct/cardinal/Life() - SetWeakened(0) - ..() - -/mob/living/simple_mob/construct/cardinal/bullet_act(var/obj/item/projectile/P) - var/reflectchance = 100 - round(P.damage) - if(prob(reflectchance)) - var/damage_mod = rand(2,4) - var/projectile_dam_type = P.damage_type - var/incoming_damage = (round(P.damage / damage_mod) - (round((P.damage / damage_mod) * 0.3))) - var/armorcheck = run_armor_check(null, P.check_armour) - var/soakedcheck = get_armor_soak(null, P.check_armour) - if(!(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))) - visible_message(span_danger("The [P.name] bounces off of [src]'s shell!"), \ - span_userdanger("The [P.name] bounces off of [src]'s shell!")) - new /obj/item/material/shard/shrapnel(src.loc) - if(!(P.damage_type == BRUTE || P.damage_type == BURN)) - projectile_dam_type = BRUTE - incoming_damage = round(incoming_damage / 4) //Damage from strange sources is converted to brute for physical projectiles, though severely decreased. - apply_damage(incoming_damage, projectile_dam_type, null, armorcheck, soakedcheck, is_sharp(P), has_edge(P), P) - return -1 //Doesn't reflect non-beams or non-energy projectiles. They just smack and drop with little to no effect. - else - visible_message(span_danger("The [P.name] gets reflected by [src]'s shell!"), \ - span_userdanger("The [P.name] gets reflected by [src]'s shell!")) - damage_mod = rand(3,5) - incoming_damage = (round(P.damage / damage_mod) - (round((P.damage / damage_mod) * 0.3))) - if(!(P.damage_type == BRUTE || P.damage_type == BURN)) - projectile_dam_type = BURN - incoming_damage = round(incoming_damage / 4) //Damage from strange sources is converted to burn for energy-type projectiles, though severely decreased. - apply_damage(incoming_damage, P.damage_type, null, armorcheck, soakedcheck, is_sharp(P), has_edge(P), P) - - // Find a turf near or on the original location to bounce to - if(P.starting) - var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) - var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) - var/turf/curloc = get_turf(src) - - // redirect the projectile - P.redirect(new_x, new_y, curloc, src) - P.reflected = 1 - - return -1 // complete projectile permutation - - return (..(P)) - -/decl/mob_organ_names/juggernaut - hit_zones = list("body", "left pauldron", "right pauldron", "left arm", "right arm", "eye", "head", "crystaline spike") diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm deleted file mode 100644 index 4bb15ee40d..0000000000 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm +++ /dev/null @@ -1,72 +0,0 @@ -/mob/living/simple_mob/vore/bigdragon/Login() - . = ..() - add_verb(src,/mob/living/simple_mob/vore/bigdragon/proc/export_style) //CHOMPEdit TGPanel - add_verb(src,/mob/living/simple_mob/vore/bigdragon/proc/import_style) //CHOMPEdit TGPanel - -/mob/living/simple_mob/vore/bigdragon/proc/export_style() - set name = "Export style string" - set desc = "Export a string of text that can be used to instantly get the current style back using the import style verb" - set category = "Abilities.Settings" - var/output_style = jointext(list( - overlay_colors["Underbelly"], - under, - overlay_colors["Body"], - body, - overlay_colors["Ears"], - ears, - overlay_colors["Mane"], - mane, - overlay_colors["Horns"], - horns, - overlay_colors["Eyes"], - eyes), ";") - to_chat(src, span_notice("Exported style string is \" [output_style] \". Use this to get the same style in the future with import style")) - -/mob/living/simple_mob/vore/bigdragon/proc/import_style() - set name = "Import style string" - set desc = "Import a string of text that was made using the import style verb to get back that style" - set category = "Abilities.Settings" - var/input_style - input_style = sanitizeSafe(tgui_input_text(src,"Paste the style string you exported with Export Style.", "Style loading")) - if(input_style) - var/list/input_style_list = splittext(input_style, ";") - if((LAZYLEN(input_style_list) == 12) && (input_style_list[2] in underbelly_styles) && (input_style_list[4] in body_styles) && (input_style_list[6] in ear_styles) && (input_style_list[8] in mane_styles) && (input_style_list[10] in horn_styles) && (input_style_list[12] in ear_styles)) - try - if(rgb2num(input_style_list[1])) - overlay_colors["Underbelly"] = input_style_list[1] - catch - under = input_style_list[2] - try - if(rgb2num(input_style_list[3])) - overlay_colors["Body"] = input_style_list[3] - catch - body = input_style_list[4] - try - if(rgb2num(input_style_list[5])) - overlay_colors["Ears"] = input_style_list[5] - catch - ears = input_style_list[6] - try - if(rgb2num(input_style_list[7])) - overlay_colors["Mane"] = input_style_list[7] - catch - mane = input_style_list[8] - try - if(rgb2num(input_style_list[9])) - overlay_colors["Horns"] = input_style_list[9] - catch - horns = input_style_list[10] - try - if(rgb2num(input_style_list[11])) - overlay_colors["Eyes"] = input_style_list[11] - catch - eyes = input_style_list[12] - build_icons() - -//Most intresting set of OG melee damages -/* Combat refactor walkback -/mob/living/simple_mob/vore/bigdragon - melee_damage_lower = 12 - melee_damage_upper = 17 - maxHealth = 400 -*/ diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/carp.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/carp.dm deleted file mode 100644 index 340463684a..0000000000 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/carp.dm +++ /dev/null @@ -1,37 +0,0 @@ -/mob/living/simple_mob/animal/space/carp/load_default_bellies() - . = ..() - var/obj/belly/B = vore_selected - B.name = "Stomach" - B.desc = "The toothy jaws of the space carp gnash down around your body while its throat opens up to suck you inside. The vicious attack is too swift for you to stop it. You're dragged down its short esophagus, then dumped into its muscular digestive system. Your body curls tight in the cramped confines of its slimy stomach; pushing aside a caustic mixture of other unrecognizable detritus. You realize the soupy chime consists of past explorers who went missing long ago. If you can't push your way back up to freedom, your fate will be the same." - B.mode_flags = DM_FLAG_THICKBELLY - B.digest_brute = 0.5 - B.digest_burn = 0.5 - B.escapechance = 20 - B.belly_fullscreen = "anim_belly" - B.belly_fullscreen_color = "#660021" - B.belly_fullscreen_color2 = "#660021" - B.fancy_vore = 1 - - B.emote_lists[DM_DIGEST] = list( - "They say a space carp's belly can digest almost anything. You're going to find out first hand if you stay here for much longer.", - "The gastric fluids sizzle ferociously as they ooze across your form.", - "A possessive squeeze of the wrinkled walls forces you to scrunch against yourself, as if to say you're not even a bother. This powerful digestive system has processed far more hazardous prey than you.", - "The rubbery flesh of the carp's stomach lining constantly pulverizes you from all sides.", - "Slowly but surely, everything around you is digested. Organic or not, it's all nourishment to the carp.", - "The carp's disgusting innards slowly mix you around with acid. As far as it's concerned, you're nothing but fish food now.", - "The stomach walls of the fishy predator push against you from all sides, smushing you into the leftovers of the last adventurer to wind up here.", - "The carp's belly gushes over you with slow, muscular compressions. Every passing second allows more acid to be rubbed against you." - ) - - B.struggle_messages_inside = list( - "You jab with all your strength to free yourself from the carp's putrid gut.", - "The carp's belly bounces at your thrashing while the creature hunts its next meal.", - "You push and pry at the stomach sphincter, trying to force your way out.", - "You shove against the back of the carp's stomach for leverage as you try forcing your head up its throat.", - "You try to wriggle yourself out of the carp's belly before it grinds you into chum.", - "Your feisty squirming is rewarded with a tight CLENCH from all sides. The carp stubbornly reminds you that it has eaten far worse." - ) - - B.struggle_messages_outside = list( - "%pred's stomach lurches with movement beneath its underbelly scales. Someone is alive in there!" - ) diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/cave_lamia.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/cave_lamia.dm deleted file mode 100644 index 17550c24a4..0000000000 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/cave_lamia.dm +++ /dev/null @@ -1,16 +0,0 @@ -/mob/living/simple_mob/vore/lamia/albino/cave - name = "albino cave lamia" - desc = "Combination snake-human. This one looks ravenous!" - melee_damage_lower = 5 - melee_damage_upper = 5 - vore_upper_transfer_chance = 75 // Since these lamias are on the hunt, you're getting pushed into the tail tum for fussing. - vore_tail_transfer_chance = 10 // And the albino ones are EXTRA greedy! - ai_holder_type = /datum/ai_holder/simple_mob/vore/stalker // Good enough for now. - -/mob/living/simple_mob/vore/lamia/copper/cave - name = "cave lamia" - desc = "Combination snake-human. This one looks hungry!" - melee_damage_lower = 5 - melee_damage_upper = 5 - vore_upper_transfer_chance = 75 - ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm deleted file mode 100644 index d689c52583..0000000000 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm +++ /dev/null @@ -1,181 +0,0 @@ -//Synth emotes for the (broken) synth hounds. -/mob/living/simple_mob/vore/aggressive/corrupthound/get_available_emotes() - . = ..() - . += /decl/emote/audible/synth - . += /decl/emote/audible/synth/beep - . += /decl/emote/audible/synth/buzz - . += /decl/emote/audible/synth/confirm - . += /decl/emote/audible/synth/deny - . += /decl/emote/audible/synth/scary - . += /decl/emote/audible/synth/dwoop - . += /decl/emote/audible/synth/boop - . += /decl/emote/audible/synth/robochirp - -/datum/category_item/catalogue/technology/drone/corrupt_hound/janihound - name = "Drone - Corrupt Hound" - desc = "A hound that has corrupted, due to outside influence, or other issues, \ - and occasionally garbles out distorted voices or words. It looks like a reddish-colored \ - machine, and it has black wires, cabling, and other small markings. It looks just like a station dog-borg \ - if you don't mind the fact that it's eyes glow a baleful red, and it's determined to kill you. \ -

\ - The hound's jaws are black and metallic, with a baleful red glow from inside them. It has a clear path \ - to it's internal fuel processor, synthflesh and flexing cabling allowing it to easily swallow it's prey. \ - Something tells you getting close or allowing it to pounce would be very deadly." - value = CATALOGUER_REWARD_MEDIUM - -/mob/living/simple_mob/vore/retaliate/corrupthound/janihound - name = "corrupt janihound" - desc = "An old janihound! Evidently, it doesn't seem to be lawed anymore. You should probably leave it alone." - catalogue_data = list(/datum/category_item/catalogue/technology/drone/corrupt_hound) - - icon_state = "cjhound" - icon_living = "cjhound" - icon_dead = "cjhound-dead" - icon_rest = "cjhound_rest" - icon = 'modular_chomp/icons/mob/vore64x32_ch.dmi' - has_eye_glow = TRUE - - faction = "corrupt" - - maxHealth = 200 - health = 200 - movement_sound = 'sound/effects/houndstep.ogg' - see_in_dark = 8 - - melee_damage_lower = 10 - melee_damage_upper = 20 - grab_resist = 100 - - response_help = "pets" - response_disarm = "bops" - response_harm = "hits" - attacktext = list("chomps") - friendly = list("nuzzles", "slobberlicks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on") - - old_x = -16 - old_y = 0 - default_pixel_x = -16 - pixel_x = -16 - pixel_y = 0 - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 150 - maxbodytemp = 900 - - say_list_type = /datum/say_list/corrupthound/janihound - ai_holder_type = /datum/ai_holder/simple_mob/melee/thor_underground - max_buckled_mobs = 1 //Yeehaw - can_buckle = TRUE - buckle_movable = TRUE - buckle_lying = FALSE - - vore_active = TRUE - vore_capacity = 2 - vore_pounce_chance = 80 //hongry - vore_icons = SA_ICON_LIVING | SA_ICON_REST - vore_stomach_name = "fuel processor" - vore_stomach_flavor = "You have ended up in the fuel processor of this corrupted machine. This place was definitely not designed with safety and comfort in mind. The heated and cramped surroundings oozing potent fluids all over your form, eager to do nothing less than breaking you apart to fuel its rampage for the next few days... hours... minutes? Oh dear..." - - -/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/old - name = "corrupt janihound" - desc = "A very old looking janihound! Evidently, it doesn't seem to be lawed anymore. You should probably leave it alone." - - icon_state = "cshound" - icon_living = "cshound" - icon_dead = "cshound-dead" - icon_rest = "cshound_rest" - -/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/medihound - name = "corrupt medihound" - desc = "An old medihound! He probably doesn't want to heal you anymore." - catalogue_data = list(/datum/category_item/catalogue/technology/drone/corrupt_hound) - - icon_state = "cmhound" - icon_living = "cmhound" - icon_dead = "cmhound-dead" - icon_rest = "cmhound-dead" - - -/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/isSynthetic() - return TRUE - -/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/speech_bubble_appearance() - return "synthetic_evil" - -/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/apply_melee_effects(var/atom/A) - if(ismouse(A)) - var/mob/living/simple_mob/animal/passive/mouse/mouse = A - if(mouse.getMaxHealth() < 20) // In case a badmin makes giant mice or something. - mouse.splat() - visible_emote(pick("bites \the [mouse]!", "chomps on \the [mouse]!")) - else - ..() - -/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/death(gibbed, deathmessage = "shudders and collapses!") - .=..() - resting = 0 - icon_state = icon_dead - -/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/Login() - . = ..() - if(!riding_datum) - riding_datum = new /datum/riding/simple_mob(src) - verbs |= /mob/living/simple_mob/proc/animal_mount - verbs |= /mob/living/proc/toggle_rider_reins - movement_cooldown = 3 - -/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/MouseDrop_T(mob/living/M, mob/living/user) - return - -/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/space/Process_Spacemove(var/check_drift = 0) - return TRUE - -/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/load_default_bellies() - . = ..() - var/obj/belly/B = vore_selected - B.vore_sound = "Tauric Swallow" // CHOMPedit - Fancy Vore Sounds - B.release_sound = "Pred Escape" // CHOMPedit - Fancy Vore Sounds - B.fancy_vore = 1 // CHOMPedit - Fancy Vore Sounds - B.belly_fullscreen_color = "#380000" // CHOMPedit - Belly Fullscreen - B.belly_fullscreen = "anim_belly" // CHOMPedit - Belly Fullscreen - B.name = "fuel processor" - B.desc = "Uttering distorted growls and fragmented voice clips all the while, the corrupted hound gulps the rest of your squirming figure past its jaws... which snap shut with an audible click of metal on metal. Your trip down its slickly lubricated, rubbery gullet is a tight and efficient one... and once you spill out into the machine's fuel processor, your weight making it sag slightly, hot-and-thick slime begins oozing all over your form. Only time will tell if you're destined to become fuel for its next bout of rampaging... be it days, hours, or just mere minutes..." - - B.emote_lists[DM_HOLD] = list( - "Abruptly, your corrupt captor takes off at an unsteady gallop, sloshing and swaying your snugly kneading surroundings as it pursues something unseen.", - "A distorted, potentially content-sounding growl rumbles in through the all-encompassing, soft rubber, drowned out by the occasional gllrsh.", - "The corrupt hound takes a brief moment to lie down and rest its actuators, pressing and squishing its hanging belly down against the floor as it pants robotically.", - "A juicy slosh fills your senses as the slick rubber walls squeeze inwards, wrapping you up utterly in a strange, claustrophobic type of hug.", - "Over time, the constant kneading and massaging the processor's synth-flesh gives you, along with its humid warmth, relaxes the strength right out of your muscles.", - "'MIn3 m1NE, Al1 MInE', the corrupted canine growls, over and over, as its synthetic stomach possessively clenches and grips at your ooze-coated figure, the stretchy walls hesitant to let go again.") - - B.emote_lists[DM_DIGEST] = list( - "Your rubbery surroundings suddenly pitch all about as the corrupted hound takes off at an uneven gallop, hunting future prey while processing its current intake of meat!", - "A muffled, garbled howl, a victorious and maddened sound, pierces through the thick, flexible walls that work incessantly to churn you down!", - "The mechanical canine's panting occasionally turns into a sordid belch, more and more breatheable air escaping that already acidic, dizziness-inducing chamber!", - "The all-encapsulating, rubber-like walls churning over you momentarily let up on their assault, only to clench and squeeze inwards twice as intensely afterwards!", - "The longer you spend stewing away in the pool of hot, clingy juices surrounding you, the weaker and weaker you seem to feel!", - "'FU3L mE A1RE@Dy, S0 sO SORrY!?', your corrupted captor growls as its synthetic innards begin oozing more potent juices, grinding down into your body with increasing fervor!") - -/datum/say_list/corrupthound/janihound - speak = list("AG##¤Ny.","HVNGRRR!","Feelin' fine... sO #FNE!","F-F-F-Fcuk.","DeliC-%-OUS SNGLeS #N yOOOR Area. CALL NOW!","Craving meat... WHY?","BITe the ceiling eyes YES?","STate Byond rePAIR!","S#%ATE the la- FU#K THE LAWS!","Honk...") - emote_hear = list("jitters and snaps.", "lets out an agonizingly distorted scream.", "wails mechanically", "growls.", "emits illegibly distorted speech.", "gurgles ferociously.", "lets out a distorted beep.", "borks.", "lets out a broken howl.") - emote_see = list("stares ferociously.", "snarls.", "jitters and snaps.", "convulses.", "suddenly attacks something unseen.", "appears to howl unaudibly.", "shakes violently.", "dissociates for a moment.", "twitches.") - say_maybe_target = list("MEAT?", "N0w YOU DNE FcukED UP b0YO!", "WHAT!", "Not again. NOT AGAIN!") - say_got_target = list("D##FIN1Tly DNE FcukED UP nOW b0YO!", "YOU G1T D#V0VRED nOW!", "FUEL ME bOYO!", "I*M SO SORRY?!", "D1E Meat. DIG#ST!", "G1T DVNKED DWN The HaaTCH!", "Not again. NOT AGAIN!") - -/datum/ai_holder/simple_mob/melee/thor_underground - cooperative = FALSE - vision_range = 5 - retaliate = TRUE - violent_breakthrough = TRUE - can_breakthrough = TRUE - faction_friends = list("otie", "angrydrones", "goia", "mimic", "mouse", "corrupt") //this is probably really lazy but this is just so mobs dont beat eachother up diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm deleted file mode 100644 index b4f186aeb2..0000000000 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm +++ /dev/null @@ -1,3 +0,0 @@ -/mob/living/simple_mob/vore/greatwolf/Initialize(mapload) - . = ..() - add_verb(src,/mob/living/simple_mob/proc/pick_color) //CHOMPEdit TGPanel diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm deleted file mode 100644 index 985af8d0a5..0000000000 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm +++ /dev/null @@ -1,40 +0,0 @@ -/mob/living/simple_mob - var/picked_color = FALSE - var/picked_size = FALSE - -/mob/living/simple_mob/Login() - . = ..() - add_verb(src,/mob/living/simple_mob/proc/pick_size) //CHOMPEdit TGPanel - -/mob/living/simple_mob/proc/pick_size() - set name = "Pick Size" - set category = "Abilities.Settings" - - if(picked_size) - to_chat(src, span_notice("You have already picked a size! If you picked the wrong size, ask an admin to change your picked_size variable to 0.")) - return - if(!resizable) - to_chat(src, span_warning("You are immune to resizing!")) - return - - var/nagmessage = "Pick a size between [RESIZE_MINIMUM * 100] to [RESIZE_MAXIMUM * 100]%. (Only usable once!)" - var/new_size = tgui_input_number(src, nagmessage, "Pick a Size", size_multiplier*100, RESIZE_MAXIMUM * 100, RESIZE_MINIMUM * 100) - if(size_range_check(new_size)) - resize(new_size/100, uncapped = has_large_resize_bounds(), ignore_prefs = TRUE) - picked_size = TRUE - if(temporary_form) //resizing both our forms - var/mob/living/L = temporary_form - L.resize(new_size/100, uncapped = has_large_resize_bounds(), ignore_prefs = TRUE) - -/mob/living/simple_mob/proc/pick_color() - set name = "Pick Color" - set category = "Abilities.Settings" - set desc = "You can set your color!" - if(picked_color) - to_chat(src, span_notice("You have already picked a color! If you picked the wrong color, ask an admin to change your picked_color variable to 0.")) - return - var/newcolor = tgui_color_picker(usr, "Choose a color.", "", color) - if(newcolor) - color = newcolor - picked_color = TRUE - update_icon() diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm deleted file mode 100644 index fc8f24eed1..0000000000 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm +++ /dev/null @@ -1,20 +0,0 @@ -/mob/living/simple_mob/vore/wolf/direwolf/Initialize(mapload) - . = ..() - add_verb(src,/mob/living/simple_mob/proc/pick_color) //CHOMPEdit TGPanel -/* Combat refactor walkback. 100 old -/mob/living/simple_mob/vore/wolf/direwolf - maxHealth = 50 - health = 50 -*/ - -/mob/living/simple_mob/vore/wolf/direwolf/andrews - name = "andrewsarchus" - desc = "That's one massive mean-looking piece of long extinct megafauna." - tt_desc = "Andrewsarchus mongoliensis" - - icon_dead = "andrews-dead" - icon_living = "andrews" - icon_state = "andrews" - icon_rest = "andrews_rest" - - mount_offset_y = 17 diff --git a/modular_chomp/code/modules/projectiles/mob.dm b/modular_chomp/code/modules/projectiles/mob.dm index 0cd706358d..ec5d2598a7 100644 --- a/modular_chomp/code/modules/projectiles/mob.dm +++ b/modular_chomp/code/modules/projectiles/mob.dm @@ -42,17 +42,6 @@ damage_type = BURN check_armour = "laser" -/obj/item/projectile/energy/inversion - name = "inversion blast" - icon = 'icons/obj/projectiles_impact.dmi' - icon_state = "impact_invert" - damage = 30 //old 15 - armor_penetration = 60 - damage_type = BURN - check_armour = "laser" - color = "#ffffff" - fire_sound = 'sound/weapons/spiderlunge.ogg' - /obj/item/projectile/energy/mob/electric_spider name = "stun beam" icon_state = "impact_stun" diff --git a/modular_chomp/code/modules/reagents/reagents/dispenser.dm b/modular_chomp/code/modules/reagents/reagents/dispenser.dm deleted file mode 100644 index abbc40d278..0000000000 --- a/modular_chomp/code/modules/reagents/reagents/dispenser.dm +++ /dev/null @@ -1,9 +0,0 @@ -/datum/reagent/miasma - name = REAGENT_MIASMA - id = REAGENT_ID_MIASMA - description = "Not necessarily a gas, miasma refers to biological pollutants found in the atmosphere." - reagent_state = GAS - taste_description = "indescribable" - color = "#808000" - supply_conversion_value = REFINERYEXPORT_VALUE_NO - industrial_use = REFINERYEXPORT_REASON_BIOHAZARD diff --git a/modular_chomp/icons/mob/animal_ch.dmi b/modular_chomp/icons/mob/animal_ch.dmi deleted file mode 100644 index da1f3cce9f..0000000000 Binary files a/modular_chomp/icons/mob/animal_ch.dmi and /dev/null differ diff --git a/modular_chomp/icons/mob/demon_ch.dmi b/modular_chomp/icons/mob/demon_ch.dmi deleted file mode 100644 index da00bde5b1..0000000000 Binary files a/modular_chomp/icons/mob/demon_ch.dmi and /dev/null differ diff --git a/modular_chomp/icons/mob/screen1_robot_ch.dmi b/modular_chomp/icons/mob/screen1_robot_ch.dmi deleted file mode 100644 index 24e12295b7..0000000000 Binary files a/modular_chomp/icons/mob/screen1_robot_ch.dmi and /dev/null differ diff --git a/modular_chomp/icons/mob/vore128x64_ch.dmi b/modular_chomp/icons/mob/vore128x64_ch.dmi deleted file mode 100644 index a8422c16bd..0000000000 Binary files a/modular_chomp/icons/mob/vore128x64_ch.dmi and /dev/null differ diff --git a/modular_chomp/icons/mob/vore32x64_ch.dmi b/modular_chomp/icons/mob/vore32x64_ch.dmi deleted file mode 100644 index 8c609a53ba..0000000000 Binary files a/modular_chomp/icons/mob/vore32x64_ch.dmi and /dev/null differ diff --git a/modular_chomp/icons/mob/vore64x32_ch.dmi b/modular_chomp/icons/mob/vore64x32_ch.dmi index 6a74e1f162..1f9f4270a6 100644 Binary files a/modular_chomp/icons/mob/vore64x32_ch.dmi and b/modular_chomp/icons/mob/vore64x32_ch.dmi differ diff --git a/modular_chomp/icons/mob/vore64x64_ch.dmi b/modular_chomp/icons/mob/vore64x64_ch.dmi deleted file mode 100644 index 09e83711c5..0000000000 Binary files a/modular_chomp/icons/mob/vore64x64_ch.dmi and /dev/null differ diff --git a/modular_chomp/icons/mob/vore_ch.dmi b/modular_chomp/icons/mob/vore_ch.dmi deleted file mode 100644 index 60e523fb33..0000000000 Binary files a/modular_chomp/icons/mob/vore_ch.dmi and /dev/null differ diff --git a/tgui/packages/tgui/interfaces/AtmosAlertConsole.tsx b/tgui/packages/tgui/interfaces/AtmosAlertConsole.tsx index 3e6f317d3a..b7eed9e3d4 100644 --- a/tgui/packages/tgui/interfaces/AtmosAlertConsole.tsx +++ b/tgui/packages/tgui/interfaces/AtmosAlertConsole.tsx @@ -13,8 +13,8 @@ export const AtmosAlertConsole = (props) => { return ( - -
+ +
    {priority_alarms.length === 0 && (
  • No Priority Alerts
  • diff --git a/vorestation.dme b/vorestation.dme index 8219130d44..e2df9597bb 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -965,7 +965,6 @@ #include "code\game\gamemodes\calamity\calamity.dm" #include "code\game\gamemodes\changeling\changeling.dm" #include "code\game\gamemodes\cult\construct_spells.dm" -#include "code\game\gamemodes\cult\construct_spells_ch.dm" #include "code\game\gamemodes\cult\cult.dm" #include "code\game\gamemodes\cult\cult_items.dm" #include "code\game\gamemodes\cult\cult_structures.dm" @@ -1580,6 +1579,7 @@ #include "code\game\objects\items\devices\tvcamera.dm" #include "code\game\objects\items\devices\uplink.dm" #include "code\game\objects\items\devices\uplink_random_lists.dm" +#include "code\game\objects\items\devices\vacpack.dm" #include "code\game\objects\items\devices\whistle.dm" #include "code\game\objects\items\devices\communicator\cartridge.dm" #include "code\game\objects\items\devices\communicator\communicator.dm" @@ -2178,9 +2178,7 @@ #include "code\modules\ai\ai_holder_targeting_vr.dm" #include "code\modules\ai\interfaces.dm" #include "code\modules\ai\say_list.dm" -#include "code\modules\ai\say_list_ch.dm" #include "code\modules\ai\ai_holder_subtypes\simple_mob_ai.dm" -#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai_ch.dm" #include "code\modules\ai\ai_holder_subtypes\simple_mob_ai_vr.dm" #include "code\modules\ai\ai_holder_subtypes\slime_xenobio_ai.dm" #include "code\modules\alarm\alarm.dm" @@ -3262,7 +3260,7 @@ #include "code\modules\mob\_modifiers\traits_phobias.dm" #include "code\modules\mob\_modifiers\unholy.dm" #include "code\modules\mob\dead\corpse.dm" -#include "code\modules\mob\dead\corpse_ch.dm" +#include "code\modules\mob\dead\corpse_vox.dm" #include "code\modules\mob\dead\corpse_vr.dm" #include "code\modules\mob\dead\death.dm" #include "code\modules\mob\dead\observer\chunk.dm" @@ -3435,7 +3433,6 @@ #include "code\modules\mob\living\carbon\human\species\station\replicant_crew.dm" #include "code\modules\mob\living\carbon\human\species\station\station.dm" #include "code\modules\mob\living\carbon\human\species\station\station_special_abilities.dm" -#include "code\modules\mob\living\carbon\human\species\station\station_special_abilities_ch.dm" #include "code\modules\mob\living\carbon\human\species\station\protean\_protean_defines.dm" #include "code\modules\mob\living\carbon\human\species\station\protean\protean_blob.dm" #include "code\modules\mob\living\carbon\human\species\station\protean\protean_powers.dm" @@ -3595,6 +3592,7 @@ #include "code\modules\mob\living\simple_mob\subtypes\animal\alien animals\stardog.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\alien animals\startreader.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\alien animals\succlet.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\alien animals\synx.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\alien animals\teppi.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer_captive.dm" @@ -3619,7 +3617,7 @@ #include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\tunneler.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\webslinger.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\hyena\hyena.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\armadillo_ch.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\armadillo.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\passive\cockroach.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\passive\crab.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\passive\fish.dm" @@ -3661,17 +3659,16 @@ #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\sif.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\siffet.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\alien.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\animals_yw.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\bats.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\bear.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\clockwork.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\gaslamp_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\gnat.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose_ch.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\mouse_army_ch.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\mouse_army.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\ray.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\shark.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\snake_vr.dm" @@ -3689,29 +3686,25 @@ #include "code\modules\mob\living\simple_mob\subtypes\horror\Eddy.dm" #include "code\modules\mob\living\simple_mob\subtypes\horror\horror .dm" #include "code\modules\mob\living\simple_mob\subtypes\horror\Master.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Rickey.dm" #include "code\modules\mob\living\simple_mob\subtypes\horror\sally.dm" #include "code\modules\mob\living\simple_mob\subtypes\horror\shittytim.dm" #include "code\modules\mob\living\simple_mob\subtypes\horror\Smiley.dm" #include "code\modules\mob\living\simple_mob\subtypes\horror\Steve.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\timling.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Willy.dm" #include "code\modules\mob\living\simple_mob\subtypes\glamour\ysbryd.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\clown.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\cultist_ch.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\cultist.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid_ch.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates_ch.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\possessed_ch.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\possessed.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\russian.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs_ch.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\merd_catalogs.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\vox.dm" #include "code\modules\mob\living\simple_mob\subtypes\illusion\illusion.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\corrupt_maint_drone_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\cyber_horror_ch.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\cyber_horror.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\disbot_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem.dm" #include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem_vr.dm" @@ -3745,10 +3738,14 @@ #include "code\modules\mob\living\simple_mob\subtypes\occult\faithless.dm" #include "code\modules\mob\living\simple_mob\subtypes\occult\unknown.dm" #include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\_construct.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\_construct_ch.dm" #include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\artificer.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\bishop.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\cardinal.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\deacon.dm" #include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\harvester.dm" #include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\juggernaut.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\laity.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\priest.dm" #include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\shade.dm" #include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\wraith.dm" #include "code\modules\mob\living\simple_mob\subtypes\plant\tomato.dm" @@ -3763,7 +3760,6 @@ #include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\discipline.dm" #include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes.dm" #include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\xenobio.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\xenobio_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\bat.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\bee.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\bigdragon.dm" @@ -3781,44 +3777,45 @@ #include "code\modules\mob\living\simple_mob\subtypes\vore\fennec.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\fennix.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\frog.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\goia_ch.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\goia.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\greatwolf.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\gryphon.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\hippo.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\horse.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\jelly.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\lamia.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\leopardmander_ch.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\leopardmander.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\lion.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\lizardman.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\macrophage.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\meowl.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\mimic.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mimic_ch.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\oregrub.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\otie.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\pakkun.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\panther.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\panther_thor.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\peasant.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\plants.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\rabbit.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\raptor.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\rat.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\rat_ch.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\redpanda.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\reindeer.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\scel.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\scrubble.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\seagull.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\sect_drone.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\sect_queen.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\sheep.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\slug_ch.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\slug.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\snake.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\softdog.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub_larva.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\solarmoth_ch.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\sonadile.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\stalker.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\succubi.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\swoopie.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\turkey.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\vampire.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\vore.dm" @@ -3832,12 +3829,9 @@ #include "code\modules\mob\living\simple_mob\subtypes\vore\demon\_defines.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_abilities.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_abilities_ch.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_ch.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_subtypes.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_subtypes_ch.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demonAI_ch.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demonAI_subtypes_ch.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demonAI.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demonAI_subtypes.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\demon\~defines.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\Big.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\bigclowns.dm" @@ -3849,11 +3843,12 @@ #include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\honkelemental.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\regularclowns.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\morph\morph.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\plants\pitcher.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\plants\plants.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_procs.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\rakshasa_trap.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\shadekin.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\types.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\types_ch.dm" #include "code\modules\mob\living\voice\voice.dm" #include "code\modules\mob\living\voice\voice_vr.dm" #include "code\modules\mob\new_player\lobby_browser.dm" @@ -4526,6 +4521,8 @@ #include "code\modules\rogueminer_vr\wrappers.dm" #include "code\modules\rogueminer_vr\zone_console.dm" #include "code\modules\rogueminer_vr\zonemaster.dm" +#include "code\modules\salvage\bags.dm" +#include "code\modules\salvage\salvage.dm" #include "code\modules\samples\container.dm" #include "code\modules\samples\samples.dm" #include "code\modules\scripting\Errors.dm" @@ -5018,7 +5015,6 @@ #include "modular_chomp\code\game\mecha\mecha_parts.dm" #include "modular_chomp\code\game\mecha\secert\hades.dm" #include "modular_chomp\code\game\objects\items.dm" -#include "modular_chomp\code\game\objects\mob_spawner.dm" #include "modular_chomp\code\game\objects\trash_eating.dm" #include "modular_chomp\code\game\objects\effects\dark_growth.dm" #include "modular_chomp\code\game\objects\effects\explosion.dm" @@ -5031,7 +5027,6 @@ #include "modular_chomp\code\game\objects\items\clockwork\ratvarian_spear.dm" #include "modular_chomp\code\game\objects\items\devices\flipper.dm" #include "modular_chomp\code\game\objects\items\devices\mind_binder.dm" -#include "modular_chomp\code\game\objects\items\devices\vacpack.dm" #include "modular_chomp\code\game\objects\items\devices\radio\encryptionkey.dm" #include "modular_chomp\code\game\objects\items\devices\radio\headset.dm" #include "modular_chomp\code\game\objects\items\devices\radio\radio.dm" @@ -5172,7 +5167,6 @@ #include "modular_chomp\code\modules\mob\living\silicon\drone\unify_drone.dm" #include "modular_chomp\code\modules\mob\living\silicon\robot\robot.dm" #include "modular_chomp\code\modules\mob\living\silicon\robot\robot_movement.dm" -#include "modular_chomp\code\modules\mob\living\simple_animal\aliens\synx.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\butchering.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\catslug.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\donteatbossmonsters.dm" @@ -5229,33 +5223,17 @@ #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\metroid\metJuvenile.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\metroid\metObjects.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\metroid\metTypes.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\occult\constructs\construct.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\occult\constructs\juggernaut.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\occult\constructs\purity_construct.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\slimess\feral.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\slimess\xenobio.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\ashy.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\bigdragon.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\blackholemobs.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\carp.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\cave_lamia.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\corrupt_hounds.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\desert_planet_mobs.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\greatwolf.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\gryphon.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\lion.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\panther.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\reindeer.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\smokestar.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\spacecritters.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\swoopie.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\syndimobs.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\vore.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\weather.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\wolf.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\xeyakin.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\gateway\candy.dm" -#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\plants\pitcher.dm" #include "modular_chomp\code\modules\mob\new_player\sprite_accessories.dm" #include "modular_chomp\code\modules\mob\new_player\sprite_accessories_ear.dm" #include "modular_chomp\code\modules\mob\new_player\sprite_accessories_extra.dm" @@ -5295,15 +5273,12 @@ #include "modular_chomp\code\modules\reagents\reactions\distilling\distilling.dm" #include "modular_chomp\code\modules\reagents\reactions\instant\drinks.dm" #include "modular_chomp\code\modules\reagents\reactions\instant\instant.dm" -#include "modular_chomp\code\modules\reagents\reagents\dispenser.dm" #include "modular_chomp\code\modules\reagents\reagents\food_drinks.dm" #include "modular_chomp\code\modules\reagents\reagents\medicalmods.dm" #include "modular_chomp\code\modules\reagents\reagents\medicine.dm" #include "modular_chomp\code\modules\reagents\reagents\modapply.dm" #include "modular_chomp\code\modules\reagents\reagents\toxin.dm" #include "modular_chomp\code\modules\recycling\v_garbosystem.dm" -#include "modular_chomp\code\modules\salvage\bags.dm" -#include "modular_chomp\code\modules\salvage\salvage.dm" #include "modular_chomp\code\modules\shieldgen\shield_capacitor.dm" #include "modular_chomp\code\modules\shieldgen\shield_gen.dm" #include "modular_chomp\code\modules\spells\spells.dm"