[MIRROR] Simple mob port [IDB IGNORE] (#11492)

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
Co-authored-by: C.L. <killer65311@gmail.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-08-23 12:08:10 -07:00
committed by GitHub
parent 9696eca7b3
commit 4febf95738
279 changed files with 4306 additions and 6372 deletions

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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
)

View File

@@ -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

View File

@@ -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))

View File

@@ -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))

View File

@@ -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)
. = ..()

View File

@@ -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"

View File

@@ -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

View File

@@ -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)

View File

@@ -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. \

View File

@@ -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 <b>Corgi</b>! Woof!"))

View File

@@ -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

View File

@@ -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 += "<a href='byond://?_src_=holder;[HrefToken()];toglang=\ref[player];lang=[html_encode(k)]'>[k]</a>"
body += "<a href='byond://?_src_=holder;[HrefToken()];toglang=\ref[player];lang=[html_encode(k)]'>[span_green(k)]</a>"
else
k = span_red(k)
body += "<a href='byond://?_src_=holder;[HrefToken()];toglang=\ref[player];lang=[html_encode(k)]'>[k]</a>"
body += "<a href='byond://?_src_=holder;[HrefToken()];toglang=\ref[player];lang=[html_encode(k)]'>[span_red(k)]</a>"
body += {"<br>"}

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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.")

View File

@@ -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!")

View File

@@ -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.

View File

@@ -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

View File

@@ -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)

View File

@@ -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]

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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),

View File

@@ -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

View File

@@ -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 << "<font color='#6F6FE2'>" + span_italics("... [pick(charmed)] ...") + "</font>"
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

View File

@@ -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.") + "<BR>"
dat += span_gray("([contents.Join(", ")])") + "<BR><BR>"
if(ore_storage) //CHOMPAdd
if(ore_storage)
dat += "<font color='red'><B>Current ore capacity:</B> [current_capacity] / [max_ore_storage].</font><BR>"
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 ? "<a href='byond://?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[hound.x];Y=[hound.y];Z=[hound.z]'>JMP</a>" : "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]

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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.")

View File

@@ -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!

View File

@@ -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

View File

@@ -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)

View File

@@ -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 youre 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! Theres 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! Youve 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

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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")

View File

@@ -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

View File

@@ -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)

View File

@@ -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")

View File

@@ -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

View File

@@ -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////////////

View File

@@ -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!"))

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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()

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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")

View File

@@ -13,7 +13,7 @@
maxHealth = 1
health = 1
nutrition = 20 //CHOMPEdit
nutrition = 20
movement_cooldown = -1

View File

@@ -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.

View File

@@ -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("<b>Something grows inside [B.owner]'s [lowertext(B.name)]!</b>"))
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)
}

View File

@@ -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"

View File

@@ -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("<b>Something grows inside [B.owner]'s [lowertext(B.name)]!</b>"))
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)
}

View File

@@ -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

View File

@@ -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."

View File

@@ -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

View File

@@ -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

View File

@@ -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!")

View File

@@ -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))

View File

@@ -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

View File

@@ -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

View File

@@ -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")

View File

@@ -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")

View File

@@ -10,4 +10,4 @@
/obj/item/reagent_containers/food/snacks/meat = 10
)
can_be_drop_prey = FALSE //CHOMP Add
can_be_drop_prey = FALSE

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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))

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 gaslamps 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 gaslamps 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

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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]..."))

View File

@@ -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

View File

@@ -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~
*/

View File

@@ -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"

View File

@@ -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

Some files were not shown because too many files have changed in this diff Show More