diff --git a/baystation12.dme b/baystation12.dme index 6bf4e73ec3..89b974d566 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -734,27 +734,33 @@ #include "code\modules\DetectiveWork\detective_work.dm" #include "code\modules\DetectiveWork\evidence.dm" #include "code\modules\DetectiveWork\footprints_and_rag.dm" -#include "code\modules\DetectiveWork\scanner.dm"#include "code\modules\events\alien_infestation.dm" +#include "code\modules\DetectiveWork\scanner.dm" +#include "code\modules\events\alien_infestation.dm" #include "code\modules\events\blob.dm" #include "code\modules\events\brand_intelligence.dm" #include "code\modules\events\carp_migration.dm" #include "code\modules\events\comms_blackout.dm" #include "code\modules\events\communications_blackout.dm" #include "code\modules\events\disease_outbreak.dm" -#include "code\modules\events\dynamic_events.dm" #include "code\modules\events\electrical_storm.dm" #include "code\modules\events\event.dm" +#include "code\modules\events\event_dynamic.dm" #include "code\modules\events\event_manager.dm" #include "code\modules\events\grid_check.dm" +#include "code\modules\events\infestation.dm" #include "code\modules\events\ion_storm.dm" -#include "code\modules\events\meteors.dm"#include "code\modules\events\prison_break.dm" +#include "code\modules\events\meteors.dm" +#include "code\modules\events\prison_break.dm" #include "code\modules\events\radiation_storm.dm" +#include "code\modules\events\rogue_drones.dm" +#include "code\modules\events\rogue_viscerators.dm" #include "code\modules\events\space_ninja.dm" #include "code\modules\events\spacevine.dm" #include "code\modules\events\spider_infestation.dm" #include "code\modules\events\spontaneous_appendicitis.dm" #include "code\modules\events\viral_infection.dm" -#include "code\modules\events\viral_outbreak.dm"#include "code\modules\flufftext\Dreaming.dm" +#include "code\modules\events\viral_outbreak.dm" +#include "code\modules\flufftext\Dreaming.dm" #include "code\modules\flufftext\Hallucination.dm" #include "code\modules\flufftext\TextFilters.dm" #include "code\modules\food\recipes_microwave.dm" @@ -957,6 +963,7 @@ #include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" #include "code\modules\mob\living\simple_animal\hostile\tree.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" #include "code\modules\mob\new_player\hud.dm" #include "code\modules\mob\new_player\login.dm" @@ -1167,7 +1174,8 @@ #include "code\WorkInProgress\Cael_Aislinn\Supermatter\ZeroPointLaser.dm" #include "code\WorkInProgress\Chinsky\ashtray.dm" #include "code\WorkInProgress\Cib\MedicalSideEffects.dm" -#include "code\WorkInProgress\Mini\ATM.dm"#include "code\WorkInProgress\Ported\policetape.dm" +#include "code\WorkInProgress\Mini\ATM.dm" +#include "code\WorkInProgress\Ported\policetape.dm" #include "code\WorkInProgress\SkyMarshal\Ultralight_procs.dm" #include "code\WorkInProgress\Susan\susan_desert_turfs.dm" #include "code\WorkInProgress\virus2\analyser.dm" diff --git a/code/modules/events/dynamic_events.dm b/code/modules/events/event_dynamic.dm similarity index 88% rename from code/modules/events/dynamic_events.dm rename to code/modules/events/event_dynamic.dm index 62d24e8ba7..524e5b55dd 100644 --- a/code/modules/events/dynamic_events.dm +++ b/code/modules/events/event_dynamic.dm @@ -41,26 +41,26 @@ // Check for additional possible events possibleEvents[/datum/event/economic_event] = 100 //see Code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events.dm possibleEvents[/datum/event/carp_migration] = 50 + 50 * active_with_role["Engineer"] + possibleEvents[/datum/event/brand_intelligence] = 50 + 25 * active_with_role["Janitor"] + + possibleEvents[/datum/event/rogue_drone] = 50 + 25 * active_with_role["Engineer"] + 25 * active_with_role["Security"] + possibleEvents[/datum/event/infestation] = 50 + 25 * active_with_role["Janitor"] + possibleEvents[/datum/event/communications_blackout] = 50 + 25 * active_with_role["AI"] + active_with_role["Scientist"] * 25 + possibleEvents[/datum/event/ionstorm] = active_with_role["AI"] * 25 + active_with_role["Cyborg"] * 25 + active_with_role["Engineer"] * 10 + active_with_role["Scientist"] * 5 + possibleEvents[/datum/event/grid_check] = 10 * active_with_role["Engineer"] + possibleEvents[/datum/event/electrical_storm] = 75 + 25 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"] - if(active_with_role["AI"] > 0 || active_with_role["Cyborg"] > 0) - possibleEvents[/datum/event/ionstorm] = active_with_role["AI"] * 25 + active_with_role["Cyborg"] * 25 + active_with_role["Engineer"] * 10 + active_with_role["Scientist"] * 5 - - if(active_with_role["Janitor"] > 0) - possibleEvents[/datum/event/brand_intelligence] = 50 + 25 * active_with_role["Janitor"] - + if(!spacevines_spawned) + possibleEvents[/datum/event/spacevine] = 5 + 10 * active_with_role["Engineer"] if(active_with_role["Engineer"] > 0 && minutes_passed >= 30) // Give engineers time to set up engine possibleEvents[/datum/event/meteor_wave] = 20 * active_with_role["Engineer"] possibleEvents[/datum/event/meteor_shower] = 80 * active_with_role["Engineer"] possibleEvents[/datum/event/blob] = 30 * active_with_role["Engineer"] - if(!spacevines_spawned) - possibleEvents[/datum/event/spacevine] = 10 * active_with_role["Engineer"] - possibleEvents[/datum/event/grid_check] = 10 * active_with_role["Engineer"] - possibleEvents[/datum/event/electrical_storm] = 75 + 25 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"] + possibleEvents[/datum/event/viral_infection] = active_with_role["Medical"] * 50 if(active_with_role["Medical"] > 0) possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 100 - possibleEvents[/datum/event/viral_infection] = active_with_role["Medical"] * 50 possibleEvents[/datum/event/viral_outbreak] = active_with_role["Medical"] * 25 possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 50 diff --git a/code/modules/events/infestation.dm b/code/modules/events/infestation.dm new file mode 100644 index 0000000000..5a0053ed58 --- /dev/null +++ b/code/modules/events/infestation.dm @@ -0,0 +1,114 @@ +#define LOC_KITCHEN 0 +#define LOC_ATMOS 1 +#define LOC_INCIN 2 +#define LOC_CHAPEL 3 +#define LOC_LIBRARY 4 +#define LOC_HYDRO 5 +#define LOC_VAULT 6 +#define LOC_CONSTR 7 +#define LOC_TECH 8 +#define LOC_ASSEMBLY 9 + +#define VERM_MICE 0 +#define VERM_LIZARDS 1 +#define VERM_SLIMES 2 + +/datum/event/infestation + announceWhen = 10 + endWhen = 11 + var/location + var/locstring + var/vermin + var/vermstring + +/datum/event/infestation/start() + + location = rand(0,9) + var/list/turf/simulated/floor/turfs = list() + var/spawn_area_type + switch(location) + if(LOC_KITCHEN) + spawn_area_type = /area/crew_quarters/kitchen + locstring = "the kitchen" + if(LOC_ATMOS) + spawn_area_type = /area/atmos + locstring = "atmospherics" + if(LOC_INCIN) + spawn_area_type = /area/maintenance/incinerator + locstring = "the incinerator" + if(LOC_CHAPEL) + spawn_area_type = /area/chapel/main + locstring = "the chapel" + if(LOC_LIBRARY) + spawn_area_type = /area/library + locstring = "the library" + if(LOC_HYDRO) + spawn_area_type = /area/hydroponics + locstring = "hydroponics" + if(LOC_VAULT) + spawn_area_type = /area/security/nuke_storage + locstring = "the vault" + if(LOC_CONSTR) + spawn_area_type = /area/construction + locstring = "the construction area" + if(LOC_TECH) + spawn_area_type = /area/storage/tech + locstring = "technical storage" + if(LOC_ASSEMBLY) + spawn_area_type = /area/assembly/assembly_line + locstring = "the unused assembly line" + + world << "looking for [spawn_area_type]" + for(var/areapath in typesof(spawn_area_type)) + world << " checking [areapath]" + var/area/A = locate(areapath) + world << " A: [A], contents.len: [A.contents.len]" + for(var/area/B in A.related) + world << " B: [B], contents.len: [B.contents.len]" + for(var/turf/simulated/floor/F in B.contents) + if(!F.contents.len) + turfs += F + + var/list/spawn_types = list() + var/max_number + vermin = rand(0,2) + switch(vermin) + if(VERM_MICE) + spawn_types = list(/mob/living/simple_animal/mouse/gray, /mob/living/simple_animal/mouse/brown, /mob/living/simple_animal/mouse/white) + max_number = 12 + vermstring = "mice" + if(VERM_LIZARDS) + spawn_types = list(/mob/living/simple_animal/lizard) + max_number = 6 + vermstring = "lizards" + if(VERM_SLIMES) + spawn_types = list(/mob/living/carbon/slime) + max_number = 3 + vermstring = "slimes" + + spawn(0) + var/num = rand(2,max_number) + while(turfs.len > 0 && num > 0) + var/turf/simulated/floor/T = pick(turfs) + turfs.Remove(T) + var/spawn_type = pick(spawn_types) + new spawn_type(T) + num-- + world << "[vermstring] spawned in [spawn_area_type]" + +/datum/event/infestation/announce() + command_alert("Bioscans indicate that [vermstring] have been breeding in [locstring]. Clear them out, before this starts to affect productivity.", "Vermin infestation") + +#undef LOC_KITCHEN +#undef LOC_ATMOS +#undef LOC_INCIN +#undef LOC_CHAPEL +#undef LOC_LIBRARY +#undef LOC_HYDRO +#undef LOC_VAULT +#undef LOC_TECH +#undef LOC_ASSEMBLY + +#undef VERM_MICE +#undef VERM_LIZARDS +#undef VERM_SLIMES \ No newline at end of file diff --git a/code/modules/events/rogue_drones.dm b/code/modules/events/rogue_drones.dm new file mode 100644 index 0000000000..d58cdf3266 --- /dev/null +++ b/code/modules/events/rogue_drones.dm @@ -0,0 +1,53 @@ +/datum/event/rogue_drone + startWhen = 10 + endWhen = 1000 + var/list/drones_list = list() + +/datum/event/rogue_drone/start() + //spawn them at the same place as carp + var/list/possible_spawns = list() + for(var/obj/effect/landmark/C in landmarks_list) + if(C.name == "carpspawn") + possible_spawns.Add(C) + + //25% chance for this to be a false alarm + var/num + if(prob(25)) + num = 0 + else + num = rand(2,6) + for(var/i=0, i drones_list.len * 0.75) + command_alert("Icarus drone control reports the malfunctioning wing has been recovered safely.", "Rogue drone alert") + else + command_alert("Icarus drone control registers disappointment at the loss of the drones, but the survivors have been recovered.", "Rogue drone alert") diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 3c28a1f717..abeeb06881 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -20,6 +20,9 @@ stop_automated_movement = 0 for(var/atom/A in ListTargets()) + if(A == src) + continue + var/atom/F = Found(A) if(F) T = F diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm new file mode 100644 index 0000000000..8da898f621 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -0,0 +1,215 @@ + +//malfunctioning combat drones +/mob/living/simple_animal/hostile/retaliate/malf_drone + name = "combat drone" + desc = "An automated combat drone armed with state of the art weaponry and shielding." + icon_state = "drone3" + icon_living = "drone3" + icon_dead = "drone_dead" + ranged = 1 + rapid = 1 + speak_chance = 5 + turns_per_move = 3 + response_help = "pokes the" + response_disarm = "gently pushes aside the" + response_harm = "hits the" + speak = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.") + emote_see = list("beeps menacingly","whirrs threateningly","scans it's immediate vicinity") + a_intent = "harm" + stop_automated_movement_when_pulled = 0 + maxHealth = 100 + health = 100 + speed = 4 + projectiletype = /obj/item/projectile/beam + projectilesound = 'sound/weapons/laser3.ogg' + destroy_surroundings = 0 + var/datum/effect/effect/system/ion_trail_follow/ion_trail + + //the drone randomly switches between these states because it's malfunctioning + var/hostile_drone = 0 + //0 - retaliate, only attack enemies that attack it + //1 - hostile, attack everything that comes near + + var/turf/patrol_target + var/explode_chance = 1 + var/disabled = 0 + + min_oxy = 0 + max_tox = 0 + max_co2 = 0 + minbodytemp = 0 + maxbodytemp = 600 + + var/has_loot = 1 + faction = "malf_drone" + +/mob/living/simple_animal/hostile/retaliate/malf_drone/New() + ..() + if(prob(5)) + projectiletype = /obj/item/projectile/beam/pulse + projectilesound = 'sound/weapons/pulse2.ogg' + ion_trail = new + ion_trail.set_up(src) + ion_trail.start() + +/mob/living/simple_animal/hostile/retaliate/malf_drone/Process_Spacemove(var/check_drift = 0) + return 1 + +/mob/living/simple_animal/hostile/retaliate/malf_drone/ListTargets() + if(hostile_drone) + return view(src, 10) + else + return ..() + +//self repair systems have a chance to bring the drone back to life +/mob/living/simple_animal/hostile/retaliate/malf_drone/Life() + + if(disabled > 0) + stat = UNCONSCIOUS + icon_state = "drone_dead" + disabled-- + if(disabled <= 0) + stat = CONSCIOUS + icon_state = "drone0" + else + return + + if(prob(1)) + src.visible_message("\red \icon[src] [src] shudders and shakes.") + if(stat == DEAD) + health = rand(5,15) + else if(health < maxHealth) + health += rand(5,15) + + if(prob(disabled ? 0 : 1)) + if(hostile_drone) + src.visible_message("\red \icon[src] [src] retracts several targetting vanes, and dulls it's running lights.") + hostile_drone = 0 + else + src.visible_message("\red \icon[src] [src] suddenly lights up, and additional targetting vanes slide into place.") + hostile_drone = 1 + + if(health / maxHealth > 0.75) + icon_state = "drone3" + explode_chance = 0 + else if(health / maxHealth > 0.5) + icon_state = "drone2" + explode_chance = 0 + else if(health / maxHealth > 0.25) + icon_state = "drone1" + explode_chance = 0.5 + else + icon_state = "drone0" + explode_chance = 5 + + if(!disabled && prob(explode_chance)) + src.visible_message("\red \icon[src] [src] begins to spark and shake violenty!") + spawn(rand(30,100)) + if(!disabled) + explosion(get_turf(src), 1, 2, 3, 7) + ..() + +//ion rifle! +/mob/living/simple_animal/hostile/retaliate/malf_drone/emp_act(severity) + health -= rand(3,15) * (severity + 1) + disabled = rand(150, 600) + hostile_drone = 0 + +/mob/living/simple_animal/hostile/retaliate/malf_drone/Del() + //some random debris left behind + if(has_loot) + var/obj/O + + //shards + O = new /obj/item/weapon/shard(src.loc) + step_to(O, get_turf(pick(view(7, src)))) + if(prob(75)) + O = new /obj/item/weapon/shard(src.loc) + step_to(O, get_turf(pick(view(7, src)))) + if(prob(50)) + O = new /obj/item/weapon/shard(src.loc) + step_to(O, get_turf(pick(view(7, src)))) + if(prob(25)) + O = new /obj/item/weapon/shard(src.loc) + step_to(O, get_turf(pick(view(7, src)))) + + //rods + O = new /obj/item/stack/rods(src.loc) + step_to(O, get_turf(pick(view(7, src)))) + if(prob(75)) + O = new /obj/item/stack/rods(src.loc) + step_to(O, get_turf(pick(view(7, src)))) + if(prob(50)) + O = new /obj/item/stack/rods(src.loc) + step_to(O, get_turf(pick(view(7, src)))) + if(prob(25)) + O = new /obj/item/stack/rods(src.loc) + step_to(O, get_turf(pick(view(7, src)))) + + //plasteel + O = new /obj/item/stack/sheet/plasteel(src.loc) + step_to(O, get_turf(pick(view(7, src)))) + if(prob(75)) + O = new /obj/item/stack/sheet/plasteel(src.loc) + step_to(O, get_turf(pick(view(7, src)))) + if(prob(50)) + O = new /obj/item/stack/sheet/plasteel(src.loc) + step_to(O, get_turf(pick(view(7, src)))) + if(prob(25)) + O = new /obj/item/stack/sheet/plasteel(src.loc) + step_to(O, get_turf(pick(view(7, src)))) + + //also drop dummy circuit boards deconstructable for research (loot) + var/obj/item/weapon/circuitboard/C + + if(prob(25)) + C = new(src.loc) + C.name = "Drone CPU motherboard" + C.origin_tech = "programming=[rand(3,10)]" + + if(prob(25)) + C = new(src.loc) + C.name = "Drone neural interface" + C.origin_tech = "biotech=[rand(3,10)]" + + if(prob(25)) + C = new(src.loc) + C.name = "Drone suspension processor" + C.origin_tech = "magnets=[rand(3,10)]" + + if(prob(25)) + C = new(src.loc) + C.name = "Drone shielding controller" + C.origin_tech = "bluespace=[rand(3,10)]" + + if(prob(25)) + C = new(src.loc) + C.name = "Drone power capacitor" + C.origin_tech = "powerstorage=[rand(3,10)]" + + if(prob(25)) + C = new(src.loc) + C.name = "Drone hull reinforcer" + C.origin_tech = "materials=[rand(3,10)]" + + if(prob(25)) + C = new(src.loc) + C.name = "Drone auto-repair system" + C.origin_tech = "engineering=[rand(3,10)]" + + if(prob(25)) + C = new(src.loc) + C.name = "Drone plasma overcharge counter" + C.origin_tech = "plasma=[rand(3,10)]" + + if(prob(25)) + C = new(src.loc) + C.name = "Drone targetting circuitboard" + C.origin_tech = "combat=[rand(3,10)]" + + if(prob(25)) + C = new(src.loc) + C.name = "Drone morality core" + C.origin_tech = "illegal=[rand(3,10)]" + + ..() diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 1beb86b5d7..81cf8d4de2 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ