diff --git a/code/game/objects/effects/spider_vr.dm b/code/game/objects/effects/spider_vr.dm new file mode 100644 index 00000000000..d40f08aa9fb --- /dev/null +++ b/code/game/objects/effects/spider_vr.dm @@ -0,0 +1,13 @@ +/obj/effect/spider/spiderling/grub + name = "grub larva" + desc = "It never stays still for long." + //M.icon = 'grub_vr.dmi' + icon_state = "spiderling" + +obj/effect/spider/spiderling/grub/process() + if(amount_grown >= 100) + var/spawn_type = /mob/living/simple_animal/retaliate/solargrub + new spawn_type(src.loc, src) + qdel(src) + else + ..() \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/largecrate_vr.dm b/code/game/objects/structures/crates_lockers/largecrate_vr.dm index 964022061ab..8182106ecaf 100644 --- a/code/game/objects/structures/crates_lockers/largecrate_vr.dm +++ b/code/game/objects/structures/crates_lockers/largecrate_vr.dm @@ -53,7 +53,8 @@ /mob/living/simple_animal/hostile/bear;0.5, /mob/living/simple_animal/hostile/bear/brown;0.5, /mob/living/simple_animal/hostile/carp, - /mob/living/simple_animal/hostile/mimic) + /mob/living/simple_animal/hostile/mimic, + /mob/living/simple_animal/retaliate/solargrub) ..() @@ -94,4 +95,4 @@ icon_state = "otiecrate" taped = 0 ..() -*/ \ No newline at end of file +*/ diff --git a/code/modules/events/event_container_vr.dm b/code/modules/events/event_container_vr.dm index 5a54e974cfe..62c297b5e8f 100644 --- a/code/modules/events/event_container_vr.dm +++ b/code/modules/events/event_container_vr.dm @@ -74,6 +74,8 @@ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Solar Storm", /datum/event/solar_storm, 30, list(ASSIGNMENT_ENGINEER = 40, ASSIGNMENT_SECURITY = 30), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, 75, list(ASSIGNMENT_SECURITY = 50, ASSIGNMENT_ENGINEER = 50), 1), + //Evil grubs that drain station power slightly ) add_disabled_events(list( new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 30), 1), diff --git a/code/modules/events/grubinfestation_vr.dm b/code/modules/events/grubinfestation_vr.dm new file mode 100644 index 00000000000..5f1161c441e --- /dev/null +++ b/code/modules/events/grubinfestation_vr.dm @@ -0,0 +1,26 @@ +/datum/event/grub_infestation + announceWhen = 90 + var/spawncount = 1 + + +/datum/event/grub_infestation/setup() + announceWhen = rand(announceWhen, announceWhen + 60) + spawncount = rand(4 * severity, 6 * severity) //grub larva only have a 50% chance to grow big and strong + sent_spiders_to_station = 0 + +/datum/event/grub_infestation/announce() + command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') + + +/datum/event/grub_infestation/start() + var/list/vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world) + if(!temp_vent.welded && temp_vent.network && temp_vent.loc.z in using_map.station_levels) + if(temp_vent.network.normal_members.len > 50) + vents += temp_vent + + while((spawncount >= 1) && vents.len) + var/obj/vent = pick(vents) + new /obj/effect/spider/spiderling/grub(vent.loc) + vents -= vent + spawncount-- diff --git a/code/modules/mob/living/simple_animal/vore/solargrub.dm b/code/modules/mob/living/simple_animal/vore/solargrub.dm new file mode 100644 index 00000000000..b6fb9d36740 --- /dev/null +++ b/code/modules/mob/living/simple_animal/vore/solargrub.dm @@ -0,0 +1,107 @@ +/* +A work in progress, lore will go here later. +List of things solar grubs should be able to do: + +1. cool foods? (grubrings) +2. have three stages of growth depending on time. (Or energy drained altho that seems like a hard one to code) +3. be capable of eating people that get knocked out. (also be able to shock attackers that don’t wear insulated gloves.) +5. ((potentially use digested people to reproduce)) +6. add glow? +*/ + +#define SINK_POWER 1 + +/mob/living/simple_animal/retaliate/solargrub + name = "juvenile solargrub" + desc = "A young sparkling solargrub" + icon = 'icons/mob/vore.dmi' //all of these are placeholders + icon_state = "solargrub" + icon_living = "solargrub" + icon_dead = "solargrub-dead" + + faction = "grubs" + maxHealth = 250 //grubs can take a lot of harm + health = 250 + move_to_delay = 5 + + melee_damage_lower = 1 + melee_damage_upper = 5 + + speak_chance = 1 + emote_see = list("squelches", "squishes") + + speed = 2 + + meat_type = /obj/item/weapon/reagent_containers/food/snacks/grubmeat + + response_help = "pokes" + response_disarm = "pushes" + response_harm = "roughly pushes" + + // solar grubs are not affected by atmos + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + + resistances = list( + HALLOSS = 0, + BRUTE = 1, + BURN = 0.1, + TOX = 0, + OXY = 0, + CLONE = 0 + ) + + var/poison_per_bite = 5 //grubs cause a shock when they bite someone + var/poison_type = "shockchem" + var/poison_chance = 100 + var/datum/powernet/PN // Our powernet + var/obj/structure/cable/attached // the attached cable + +/mob/living/simple_animal/retaliate/solargrub/Life() + . = ..() + if(!. || ai_inactive) return + + if(stance == STANCE_IDLE) + //first, check for potential cables nearby to powersink + var/turf/S = loc + attached = locate() in S + if(attached) + if(prob(2)) + src.visible_message("\The [src] begins to sink power from the net.") + anchored = 1 + PN = attached.powernet + PN.draw_power(150000) + var/apc_drain_rate = 4000 //5000 seems a bit high, knocking it down to 4000 + for(var/obj/machinery/power/terminal/T in PN.nodes) + if(istype(T.master, /obj/machinery/power/apc)) + var/obj/machinery/power/apc/A = T.master + if(A.operating && A.cell) + var/cur_charge = A.cell.charge / CELLRATE + var/drain_val = min(apc_drain_rate, cur_charge) + A.cell.use(drain_val * CELLRATE) + else if(!attached && anchored) + anchored = 0 + PN = null + +/mob/living/simple_animal/retaliate/solargrub //active noms + vore_active = 1 + vore_capacity = 1 + vore_pounce_chance = 0 //grubs only eat incapacitated targets + +/mob/living/simple_animal/retaliate/solargrub/PunchTarget() + . = ..() + if(isliving(.)) + var/mob/living/L = . + if(L.reagents) + L.reagents.add_reagent(poison_type, poison_per_bite) + if(prob(poison_chance)) + L << "You feel a shock rushing through your veins." + L.reagents.add_reagent(poison_type, poison_per_bite) + + diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm index bebbb913250..d680656be8b 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm @@ -29,3 +29,19 @@ /datum/reagent/numbing_enzyme/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.add_chemical_effect(CE_PAINKILLER, 200) + +/datum/reagent/vermicetol + name = "Vermicetol" + id = "vermicetol" + description = "A potent chemical that treats burn damage at an exceptional rate and lasts a while." + taste_description = "sparkles" + reagent_state = SOLID + color = "#964e06" + overdose = 10 + scannable = 1 + metabolism = 0.02 + mrate_static = TRUE + +/datum/reagent/vermicetol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien != IS_DIONA) + M.heal_organ_damage(0, 21 * removed) //more potent than keloderm diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm index ff6f713b670..9788c70cc6a 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm @@ -124,3 +124,17 @@ P.absorbed = 0 M.visible_message("Something spills into [M]'s [lowertext(B.name)]!") return + +//Special toxins for solargrubs + +/datum/reagent/grubshock + name = "200 V" //in other words a painful shock + id = "shockchem" + description = "A liquid that quickly dissapates to deliver a painful shock." + reagent_state = LIQUID + color = "#E4EC2F" + metabolism = 2.50 + var/power = 11 + +/datum/reagent/grubshock/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + M.take_organ_damage(0, removed * power * 0.2) diff --git a/code/modules/reagents/Chemistry-Recipes_vr.dm b/code/modules/reagents/Chemistry-Recipes_vr.dm index de7f707ac56..28dbbacd245 100644 --- a/code/modules/reagents/Chemistry-Recipes_vr.dm +++ b/code/modules/reagents/Chemistry-Recipes_vr.dm @@ -73,6 +73,14 @@ required_reagents = list("milk" = 2, "hydrogen" = 1, "potassium" = 1) result_amount = 3 +/datum/chemical_reaction/vermicetol + name = "Vermicetol" + id = "vermicetol" + result = "vermicetol" + required_reagents = list("kelotane" = 1, "dermaline" = 1, "shockchem" = 1, "phoron" = 0.1) + catalysts = list("phoron" = 5) + result_amount = 3 + /////////////////////////////// //SLIME CORES BELOW HERE/////// /////////////////////////////// diff --git a/code/modules/reagents/reagent_containers/food/snacks_vr.dm b/code/modules/reagents/reagent_containers/food/snacks_vr.dm index 721b9742c91..9c73156385c 100644 --- a/code/modules/reagents/reagent_containers/food/snacks_vr.dm +++ b/code/modules/reagents/reagent_containers/food/snacks_vr.dm @@ -190,6 +190,19 @@ reagents.add_reagent("protein", 4) bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/grubmeat + name = "grubmeat" + desc = "A slab of grub meat, it gives a gentle shock if you touch it" + icon = 'icons/obj/food_vr.dmi' + icon_state = "grubmeat" + center_of_mass = list("x"=16, "y"=10) + +/obj/item/weapon/reagent_containers/food/snacks/grubmeat/New() + ..() + reagents.add_reagent("protein", 6) + reagents.add_reagent("shockchem", 6) + bitesize = 6 + /obj/item/weapon/reagent_containers/food/snacks/monkeycube/sobakacube name = "sobaka cube" monkey_type = "Sobaka" diff --git a/icons/mob/vore.dmi b/icons/mob/vore.dmi index 34b51493abe..e34a68f2e8c 100644 Binary files a/icons/mob/vore.dmi and b/icons/mob/vore.dmi differ diff --git a/icons/obj/food_vr.dmi b/icons/obj/food_vr.dmi index f79a37f3ae1..b541e7ebd2e 100644 Binary files a/icons/obj/food_vr.dmi and b/icons/obj/food_vr.dmi differ diff --git a/vorestation.dme b/vorestation.dme index f5838a99280..6bbd0117191 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -802,6 +802,7 @@ #include "code\game\objects\effects\overlays.dm" #include "code\game\objects\effects\portals.dm" #include "code\game\objects\effects\spiders.dm" +#include "code\game\objects\effects\spider_vr.dm" #include "code\game\objects\effects\step_triggers.dm" #include "code\game\objects\effects\zone_divider.dm" #include "code\game\objects\effects\chem\chemsmoke.dm" @@ -1488,6 +1489,7 @@ #include "code\modules\events\event_manager.dm" #include "code\modules\events\gravity.dm" #include "code\modules\events\grid_check.dm" +#include "code\modules\events\grubinfestation_vr.dm" #include "code\modules\events\ian_storm_vr.dm" #include "code\modules\events\infestation.dm" #include "code\modules\events\ion_storm.dm" @@ -1979,6 +1981,7 @@ #include "code\modules\mob\living\simple_animal\vore\horse.dm" #include "code\modules\mob\living\simple_animal\vore\panther.dm" #include "code\modules\mob\living\simple_animal\vore\snake.dm" +#include "code\modules\mob\living\simple_animal\vore\solargrub.dm" #include "code\modules\mob\living\simple_animal\vore\wah.dm" #include "code\modules\mob\living\simple_animal\vore\wolf.dm" #include "code\modules\mob\living\simple_animal\vore\zz_vore_overrides.dm"