From 769a5d3bff0db7b8dc2798124e1d14178a7ec8e4 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 8 Oct 2015 18:38:45 -0400 Subject: [PATCH 1/7] FUUUUUUUUUUUUUUUUUUUUUUUUUUUU Merge conflict EXTREAME FIX --- code/_onclick/hud/hud.dm | 2 + code/game/machinery/doors/windowdoor.dm | 6 +- code/game/machinery/machinery.dm | 13 +- code/game/machinery/portable_turret.dm | 2 +- .../structures/crates_lockers/closets.dm | 2 + code/game/objects/structures/window.dm | 3 +- code/modules/awaymissions/gateway.dm | 11 +- code/modules/events/event_container.dm | 3 +- code/modules/mob/language.dm | 11 + .../mob/living/carbon/alien/alien_defenses.dm | 14 +- code/modules/mob/living/carbon/carbon.dm | 12 +- code/modules/mob/living/carbon/human/human.dm | 7 +- .../modules/mob/living/silicon/robot/robot.dm | 14 +- .../living/simple_animal/bot_swarm/swarmer.dm | 598 ++++++++++++++++++ .../simple_animal/bot_swarm/swarmer_event.dm | 38 ++ .../mob/living/simple_animal/simple_animal.dm | 37 +- code/modules/mob/mob_helpers.dm | 5 + icons/mob/swarmer.dmi | Bin 0 -> 15477 bytes paradise.dme | 2 + 19 files changed, 754 insertions(+), 26 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm create mode 100644 code/modules/mob/living/simple_animal/bot_swarm/swarmer_event.dm create mode 100644 icons/mob/swarmer.dmi diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index a0430b09569..901d4ecbab9 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -199,6 +199,8 @@ datum/hud/New(mob/owner) else if(mymob.mind && mymob.mind.vampire) vampire_hud() human_hud('icons/mob/screen1_Vampire.dmi') + else if(isswarmer(mymob)) + swarmer_hud() //Triggered when F12 is pressed (Unless someone changed something in the DMF) /mob/verb/button_pressed_F12(var/full = 0 as null) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 0c53fd9bcca..796eadccad0 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -219,10 +219,8 @@ if(!isanimal(user)) return var/mob/living/simple_animal/M = user - if(M.melee_damage_upper <= 0) - return - attack_generic(M, M.melee_damage_upper) - + if(M.melee_damage_upper > 0 && (M.melee_damage_type == BRUTE || M.melee_damage_type == BURN)) + attack_generic(M, M.melee_damage_upper) /obj/machinery/door/window/attack_slime(mob/living/carbon/slime/user as mob) if(!user.is_adult) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index bed10ccf131..eadc838c33e 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -325,6 +325,15 @@ Class Procs: /obj/machinery/CouldNotUseTopic(var/mob/user) usr.unset_machine() +/obj/machinery/proc/dropContents()//putting for swarmers, occupent code commented out, someone can use later. + var/turf/T = get_turf(src) + for(var/atom/movable/AM in contents) + AM.forceMove(T) + //if(occupant) + // if(occupant.client) + // occupant.client.eye = occupant + // occupant.client.perspective = MOB_PERSPECTIVE + // occupant = null //////////////////////////////////////////////////////////////////////////////////////////// /obj/machinery/attack_ai(var/mob/user as mob) @@ -352,11 +361,11 @@ Class Procs: else if(prob(H.getBrainLoss())) user << "You momentarily forget how to use [src]." return 1 - + if(panel_open) src.add_fingerprint(user) return 0 - + if(!interact_offline && stat & (NOPOWER|BROKEN|MAINT)) return 1 diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 13bdaeec032..7eb83f7d369 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -396,7 +396,7 @@ var/list/turret_icons /obj/machinery/porta_turret/attack_animal(mob/living/simple_animal/M) M.changeNext_move(CLICK_CD_MELEE) M.do_attack_animation(src) - if(M.melee_damage_upper == 0) + if(M.melee_damage_upper == 0 || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN)) return if(!(stat & BROKEN)) visible_message("[M] [M.attacktext] [src]!") diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index b15fa393e9b..c96af327e04 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -142,12 +142,14 @@ for (var/atom/movable/A as mob|obj in src) A.forceMove(loc) A.ex_act(severity++) + new /obj/item/stack/sheet/metal(loc) qdel(src) if(3) if(prob(5)) for(var/atom/movable/A as mob|obj in src) A.forceMove(loc) A.ex_act(severity++) + new /obj/item/stack/sheet/metal(loc) qdel(src) /obj/structure/closet/bullet_act(var/obj/item/projectile/Proj) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 928d0c5ec2c..2e38ae54079 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -153,7 +153,8 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f /obj/structure/window/attack_animal(mob/living/user as mob) if(!isanimal(user)) return var/mob/living/simple_animal/M = user - if(M.melee_damage_upper <= 0) return + if(M.melee_damage_upper <= 0 || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN)) + return attack_generic(M, M.melee_damage_upper) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index e7c77f639f3..964da2ca2b9 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -1,3 +1,4 @@ +var/obj/machinery/gateway/centerstation/the_gateway = null /obj/machinery/gateway name = "gateway" desc = "A mysterious gateway built by unknown hands, it allows for faster than light travel to far-flung locations." @@ -10,6 +11,8 @@ /obj/machinery/gateway/New() + if(!the_gateway) + the_gateway = src spawn(25) update_icon() if(dir == 2) @@ -37,12 +40,19 @@ var/obj/machinery/gateway/centeraway/awaygate = null /obj/machinery/gateway/centerstation/New() + if(!the_gateway) + the_gateway = src spawn(25) update_icon() wait = world.time + config.gateway_delay //+ thirty minutes default awaygate = locate(/obj/machinery/gateway/centeraway) in world +/obj/machinery/gateway/centerstation/Destroy() + if(the_gateway == src) + the_gateway = null + return ..() + /obj/machinery/gateway/centerstation/update_icon() if(active) icon_state = "oncenter" @@ -243,4 +253,3 @@ obj/machinery/gateway/centerstation/process() user << "Recalibration successful!: \black This gate's systems have been fine tuned. Travel to this gate will now be on target." calibrated = 1 return - \ No newline at end of file diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 9eb6e4728b6..881ee29d402 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -169,7 +169,8 @@ var/list/event_last_fired = list() new /datum/event_meta(EVENT_LEVEL_MODERATE, "Bluespace Anomaly", /datum/event/anomaly/anomaly_bluespace, 50, list(ASSIGNMENT_ENGINEER = 25)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Flux Anomaly", /datum/event/anomaly/anomaly_flux, 50, list(ASSIGNMENT_ENGINEER = 50)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravitational Anomaly", /datum/event/anomaly/anomaly_grav, 200), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Revenant", /datum/event/revenant, 150) + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Revenant", /datum/event/revenant, 150), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Swarmer Spawn", /datum/event/spawn_swarmer, 150, list(ASSIGNMENT_ANY = 100), 1) ) /datum/event_container/major diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 937ee9d86d8..fad5c590e1b 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -508,6 +508,17 @@ drone_only = 1 follow = 1 +/datum/language/swarmer + name = "Swarmer" + desc = "A heavily encoded alien binary pattern." + speech_verb = "tones" + ask_verb = "tones" + exclaim_verb = "tones" + colour = "say_quote" + key = "z"//Zwarmer...Or Zerg! + flags = RESTRICTED || HIVEMIND + follow = 1 + // Language handling. /mob/proc/add_language(var/language) diff --git a/code/modules/mob/living/carbon/alien/alien_defenses.dm b/code/modules/mob/living/carbon/alien/alien_defenses.dm index ed98e221993..7ae01f43cfe 100644 --- a/code/modules/mob/living/carbon/alien/alien_defenses.dm +++ b/code/modules/mob/living/carbon/alien/alien_defenses.dm @@ -66,5 +66,17 @@ In all, this is a lot like the monkey code. /N /mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M as mob) if(..()) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - adjustBruteLoss(damage) + switch(M.melee_damage_type) + if(BRUTE) + adjustBruteLoss(damage) + if(BURN) + adjustFireLoss(damage) + if(TOX) + adjustToxLoss(damage) + if(OXY) + adjustOxyLoss(damage) + if(CLONE) + adjustCloneLoss(damage) + if(STAMINA) + adjustStaminaLoss(damage) updatehealth() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 1ea66f59c61..3be3cd9d865 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -107,13 +107,14 @@ mob/living return return -/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null) +/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null,var/override = 0) + if(status_flags & GODMODE) //godmode return 0 if(NO_SHOCK in mutations) //shockproof return 0 shock_damage *= siemens_coeff - if (shock_damage<1) + if(shock_damage<1 && !override) return 0 src.apply_damage(shock_damage, BURN, def_zone, used_weapon="Electrocution") @@ -127,6 +128,8 @@ mob/living "\red You feel a mild shock course through your body.", \ "\red You hear a light zapping." \ ) + jitteriness += (rand(2,4))//mostly for the swarmer trap + do_jitter_animation(jitteriness) if (shock_damage > 10) if (shock_damage < 200) src.visible_message( @@ -150,7 +153,10 @@ mob/living ) playsound(loc, "sound/effects/eleczap.ogg", 50, 1, -1) explosion(src.loc,-1,0,2,2) - return shock_damage + if(override) + return override + else + return shock_damage /mob/living/carbon/proc/swap_hand() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 465e4a8d6f1..c008ba43de7 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -414,7 +414,7 @@ var/obj/item/organ/external/affected = src.get_organ(dam_zone) if(affected) affected.add_autopsy_data(M.name, damage) // Add the mob's name to the autopsy data - apply_damage(damage, BRUTE, affecting, armor, M.name) + apply_damage(damage,M.melee_damage_type, affecting, armor, M.name) updatehealth() /mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L as mob) @@ -726,7 +726,8 @@ //Removed the horrible safety parameter. It was only being used by ninja code anyways. //Now checks siemens_coefficient of the affected area by default -/mob/living/carbon/human/electrocute_act(var/shock_damage, var/obj/source, var/base_siemens_coeff = 1.0, var/def_zone = null) +/mob/living/carbon/human/electrocute_act(var/shock_damage, var/obj/source, var/base_siemens_coeff = 1.0, var/def_zone = null,var/override = 0) + if(status_flags & GODMODE) //godmode return 0 if(NO_SHOCK in mutations) //shockproof @@ -738,7 +739,7 @@ var/obj/item/organ/external/affected_organ = get_organ(check_zone(def_zone)) var/siemens_coeff = base_siemens_coeff * get_siemens_coefficient_organ(affected_organ) - return ..(shock_damage, source, siemens_coeff, def_zone) + return ..(shock_damage, source, siemens_coeff, def_zone,override) /mob/living/carbon/human/Topic(href, href_list) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index f7372a79f5f..5127277a053 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -917,7 +917,19 @@ var/list/robot_verbs_default = list( visible_message("[M] [M.attacktext] [src]!") add_logs(M, src, "attacked", admin=0) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - adjustBruteLoss(damage) + switch(M.melee_damage_type) + if(BRUTE) + adjustBruteLoss(damage) + if(BURN) + adjustFireLoss(damage) + if(TOX) + adjustToxLoss(damage) + if(OXY) + adjustOxyLoss(damage) + if(CLONE) + adjustCloneLoss(damage) + if(STAMINA) + adjustStaminaLoss(damage) updatehealth() diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm new file mode 100644 index 00000000000..9e01622efc4 --- /dev/null +++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm @@ -0,0 +1,598 @@ +////Deactivated swarmer shell//// +/obj/item/unactivated_swarmer + name = "unactivated swarmer" + desc = "A currently unactivated swarmer. Swarmers can self activate at any time, it would be wise to immediately dispose of this." + icon = 'icons/mob/swarmer.dmi' + icon_state = "swarmer_unactivated" + +/obj/item/unactivated_swarmer/New() + notify_ghosts("An unactivated swarmer has been created in [get_area(src)]! (Click to enter)") + ..() + +/obj/item/unactivated_swarmer/Topic(href, href_list) + if(href_list["ghostjoin"]) + var/mob/dead/observer/ghost = usr + if(istype(ghost)) + attack_ghost(ghost) + +/obj/item/unactivated_swarmer/attack_ghost(mob/user) + var/be_swarmer = alert("Become a swarmer? (Warning, You can no longer be cloned!)",,"Yes","No") + if(be_swarmer == "No") + return + if(qdeleted(src)) + user << "Swarmer has been occupied by someone else." + return + var/mob/living/simple_animal/hostile/swarmer/S = new /mob/living/simple_animal/hostile/swarmer(get_turf(loc)) + S.key = user.key + qdel(src) + +////The Mob itself//// + +/mob/living/simple_animal/hostile/swarmer + name = "Swarmer" + real_name = "Swarmer" + icon = 'icons/mob/swarmer.dmi' + desc = "A robot of unknown design, they seek only to consume materials and replicate themselves indefinitely." + speak_emote = list("tones") + health = 40 + maxHealth = 40 + status_flags = CANPUSH + icon_state = "swarmer" + icon_living = "swarmer" + icon_dead = "swarmer_unactivated" + wander = 0 + harm_intent_damage = 5 + minbodytemp = 0 + maxbodytemp = 500 + unsuitable_atmos_damage = 0 + melee_damage_lower = 15 + melee_damage_upper = 15 + melee_damage_type = STAMINA + ignored_damage_types = list(BRUTE = 0, BURN = 0, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) + environment_smash = 0 + attacktext = "shocks" + attack_sound = 'sound/effects/EMPulse.ogg' + friendly = "pinches" + speed = 0 + faction = list("swarmer") + projectiletype = /obj/item/projectile/beam/disabler + pass_flags = PASSTABLE + ventcrawler = 2 + ranged = 1 + projectiletype = /obj/item/projectile/beam/disabler + ranged_cooldown_cap = 2 + projectilesound = 'sound/weapons/taser2.ogg' + AIStatus = AI_OFF + var/resources = 0 //Resource points, generated by consuming metal/glass + +/mob/living/simple_animal/hostile/swarmer/Login() + ..() + src << "You are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate." + src << "Ctrl + Click provides most of your swarmer specific interactions, such as cannibalizing metal or glass, destroying the environment, or teleporting mobs away from you." + src << "Objectives:" + src << "1. Consume resources and replicate until there are no more resources left." + src << "2. Ensure that the station is fit for invasion at a later date, do not perform actions that would render it dangerous or inhospitable." + src << "3. Biological and Sentient resources will be harvested at a later date, do not harm them." + +/mob/living/simple_animal/hostile/swarmer/New() + ..() + add_language("Swarmer", 1) + verbs -= /atom/movable/verb/pull + updatename() + +/mob/living/simple_animal/hostile/swarmer/Stat() + ..() + if(statpanel("Status")) + stat("Resources:",resources) + +/mob/living/simple_animal/hostile/swarmer/Die() + ..() + new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc) + ghostize() + qdel(src) + +/mob/living/simple_animal/hostile/swarmer/emp_act() + if(health > 1) + health = 1 + return + else + Die() + +/mob/living/simple_animal/hostile/swarmer/CanPass(atom/movable/O) + if(istype(O, /obj/item/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other + return 1 + if(isswarmer(O)) + return 1 + ..() + +/mob/living/simple_animal/hostile/swarmer/proc/updatename() + real_name = "Swarmer [rand(100,999)]-[pick("kappa","sigma","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]" + name = real_name + +////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S//// +/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A) + face_atom(A) + if(!isturf(loc)) + return + if(next_move > world.time) + return + if(!A.Adjacent(src)) + return + A.swarmer_act(src) + return + +/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S.DisIntegrate(src) + +/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S.Integrate(src) + +/obj/item/weapon/gun/swarmer_act()//Stops you from eating the entire armory + return + +/turf/simulated/floor/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor + return + +/obj/machinery/atmospherics/swarmer_act() + return + +/obj/structure/disposalpipe/swarmer_act() + return + +/obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S.DismantleMachine(src) + +/obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S.DisIntegrate(src) + +/obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S.DisIntegrate(src) + +/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S.DisIntegrate(src) + deactivate(S, 0) + +/obj/machinery/particle_accelerator/control_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S.DisIntegrate(src) + +/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S.DisIntegrate(src) + +/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S.DisIntegrate(src) + +/obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//It's more visually interesting than dismantling the machine + S.DisIntegrate(src) + +/obj/machinery/turretid/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S.DisIntegrate(src) + +/obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "The volatile chemicals in this machine would destroy us. Aborting." + +/obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "This device's destruction would result in the extermination of everything in the area. Aborting." + +/obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Searching... sensor malfunction! Target lost. Aborting." + +/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Destroying this object would cause a chain reaction. Aborting." + +/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Disrupting the power grid would bring no benefit to us. Aborting." + +/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "An inhospitable area may be created as a result of destroying this object. Aborting." + +/obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting." + +/obj/machinery/message_server/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting." + +/obj/machinery/blackbox_recorder/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "This machine has recorded large amounts of data on this structure and its inhabitants, it will be a useful resource to our masters in the future. Aborting. " + + +/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Disrupting the power grid would bring no benefit to us. Aborting." + +/obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "This bluespace source will be important to us later. Aborting." + +/turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + for(var/turf/T in range(1, src)) + if(istype(T, /turf/space) || istype(T.loc, /area/space)) + S << "Destroying this object has the potential to cause a hull breach. Aborting." + return + ..() + +/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + for(var/turf/T in range(1, src)) + if(istype(T, /turf/space) || istype(T.loc, /area/space)) + S << "Destroying this object has the potential to cause a hull breach. Aborting." + return + ..() + +/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource + S << "This object does not contain enough materials to work with." + +/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Attempting to dismantle this machine would result in an immediate counterattack. Aborting." + +/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S.DisperseTarget(src) + +/mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "This biological resource is somehow resisting our bluespace transceiver. Aborting." + +////END CTRL CLICK FOR SWARMERS//// + +/mob/living/simple_animal/hostile/swarmer/proc/Fabricate(var/atom/fabrication_object,var/fabrication_cost = 0) + if(!isturf(loc)) + src << "This is not a suitable location for fabrication. We need more space." + if(resources >= fabrication_cost) + resources -= fabrication_cost + else + src << "You do not have the necessary resources to fabricate this object." + return 0 + new fabrication_object(loc) + return 1 + +/mob/living/simple_animal/hostile/swarmer/proc/Integrate(var/obj/item/target) + if(resources >= 100) + src << "We cannot hold more materials!" + return + //Check if any entries are either MAT_METAL or MAT_GLASS + if((MAT_METAL in target.materials) || (MAT_GLASS in target.materials)) + resources++ + do_attack_animation(target) + changeNext_move(CLICK_CD_MELEE) + var/obj/effect/swarmer/integrate/I = new /obj/effect/swarmer/integrate(get_turf(target)) + I.pixel_x = target.pixel_x + I.pixel_y = target.pixel_y + I.pixel_z = target.pixel_z + if(istype(target, /obj/item/stack)) + var/obj/item/stack/S = target + S.use(1) + if(S.amount) + return + qdel(target) + else + src << "\the [target] is incompatible with our internal matter recycler." + return + +/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(var/atom/movable/target) + new /obj/effect/swarmer/disintegration(get_turf(target)) + do_attack_animation(target) + changeNext_move(CLICK_CD_MELEE) + target.ex_act(3) + return + +/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(var/mob/living/target) + if(target != src) + src << "Attempting to remove this being from our presence." + if(src.z != ZLEVEL_STATION) + src << "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area." + return + if(do_mob(src, target, 30)) + var/cycle + for(cycle=0,cycle<100,cycle++) + var/random_location = locate(rand(37,202),rand(75,192),ZLEVEL_STATION)//Drunk dial a turf in the general ballpark of the station + if(istype(random_location, /turf/simulated/floor)) + var/turf/simulated/floor/F = random_location + if(F.air) + var/datum/gas_mixture/A = F.air + if(A.oxygen >= 16 && !A.toxins && A.carbon_dioxide < 10 && !A.trace_gases.len)//Can most things breathe in this location? + if((A.temperature > 270) && (A.temperature < 360))//Not too hot, not too cold + var/pressure = A.return_pressure() + if((pressure > 20) && (pressure < 550))//Account for crushing pressure or vaccuums + if(ishuman(target))//If we're getting rid of a human, slap some zipties on them to keep them away from us a little longer + var/obj/item/weapon/restraints/handcuffs/cable/zipties/Z = new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) + var/mob/living/carbon/human/H = target + Z.apply_cuffs(H, src) + do_teleport(target, F, 0) + playsound(src,'sound/effects/sparks4.ogg',50,1) + break + return + +/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(var/obj/machinery/target) + do_attack_animation(target) + src << "We begin to dismantle this machine. We will need to be uninterrupted." + var/obj/effect/swarmer/dismantle/D = new /obj/effect/swarmer/dismantle(get_turf(target)) + D.pixel_x = target.pixel_x + D.pixel_y = target.pixel_y + D.pixel_z = target.pixel_z + if(do_mob(src, target, 100)) + src << "Dismantling complete." + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc) + M.amount = 5 + if(target.component_parts && target.component_parts.len) + for(var/obj/item/I in target.component_parts) + I.forceMove(M.loc) + var/obj/effect/swarmer/disintegration/N = new /obj/effect/swarmer/disintegration(get_turf(target)) + N.pixel_x = target.pixel_x + N.pixel_y = target.pixel_y + N.pixel_z = target.pixel_z + target.dropContents() + if(istype(target, /obj/machinery/computer)) + var/obj/machinery/computer/C = target + if(C.circuit) + var/obj/item/weapon/circuitboard/circuit = text2path(C.circuit) + new circuit(get_turf(M)) + qdel(target) + + +/obj/effect/swarmer //Default swarmer effect object visual feedback + name = "swarmer ui" + desc = null + gender = NEUTER + icon = 'icons/mob/swarmer.dmi' + icon_state = "ui_light" + mouse_opacity = 0 + layer = 4 + unacidable = 1 + +/obj/effect/swarmer/disintegration + icon_state = "disintegrate" + +/obj/effect/swarmer/disintegration/New() + playsound(src.loc, "sparks", 100, 1) + spawn(10) + qdel(src) + +/obj/effect/swarmer/dismantle + icon_state = "dismantle" + +/obj/effect/swarmer/dismantle/New() + spawn(25) + qdel(src) + +/obj/effect/swarmer/integrate + icon_state = "integrate" + +/obj/effect/swarmer/integrate/New() + spawn(5) + qdel(src) + +/obj/effect/swarmer/destructible //Default destroyable object for swarmer constructions + light_range = 1 + mouse_opacity = 1 + var/health = 30 + +/obj/effect/swarmer/destructible/proc/TakeDamage(damage) + health -= damage + if(health <= 0) + qdel(src) + +/obj/effect/swarmer/destructible/bullet_act(obj/item/projectile/Proj) + if(Proj.damage) + if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + TakeDamage(Proj.damage) + ..() + +/obj/effect/swarmer/destructible/attackby(obj/item/weapon/I, mob/living/user, params) + if(istype(I, /obj/item/weapon)) + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + TakeDamage(I.force) + return + +/obj/effect/swarmer/destructible/ex_act() + qdel(src) + return + +/obj/effect/swarmer/destructible/blob_act() + qdel(src) + return + +/obj/effect/swarmer/destructible/emp_act() + qdel(src) + return + +/obj/effect/swarmer/destructible/attack_animal(mob/living/user) + if(isanimal(user)) + var/mob/living/simple_animal/S = user + S.do_attack_animation(src) + user.changeNext_move(CLICK_CD_MELEE) + if(S.melee_damage_type == BRUTE || S.melee_damage_type == BURN) + TakeDamage(rand(S.melee_damage_lower, S.melee_damage_upper)) + return + +/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap() + set name = "Create trap" + set category = "Swarmer" + set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources" + if(/obj/effect/swarmer/destructible/trap in loc) + src << "There is already a trap here. Aborting." + return + Fabricate(/obj/effect/swarmer/destructible/trap, 5) + return + +/obj/effect/swarmer/destructible/trap + name = "swarmer trap" + desc = "A quickly assembled trap that electrifies living beings and overwhelms machine sensors. Will not retain its form if damaged enough." + icon_state = "trap" + light_range = 1 + health = 10 + +/obj/effect/swarmer/destructible/trap/Crossed(var/atom/movable/AM) + if(isliving(AM)) + var/mob/living/L = AM + if(!istype(L, /mob/living/simple_animal/hostile/swarmer)) + playsound(loc,'sound/effects/snap.ogg',50, 1, -1) + L.Stun(1) //i am doing this here instead of electrocute act + L.electrocute_act(0, src, 1, "l_foot", 1) + if(isrobot(L) || L.isSynthetic()) + L.Weaken(5) + qdel(src) + ..() + +/mob/living/simple_animal/hostile/swarmer/proc/CreateBarricade() + set name = "Create barricade" + set category = "Swarmer" + set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through." + if(/obj/effect/swarmer/destructible/blockade in loc) + src << "There is already a blockade here. Aborting." + return + if(resources < 5) + src << "We do not have the resources for this!" + return + if(do_mob(src, src, 10)) + Fabricate(/obj/effect/swarmer/destructible/blockade, 5) + return + +/obj/effect/swarmer/destructible/blockade + name = "swarmer blockade" + desc = "A quickly assembled energy blockade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through." + icon_state = "barricade" + light_range = 1 + health = 50 + density = 1 + anchored = 1 + +/obj/effect/swarmer/destructible/blockade/CanPass(atom/movable/O) + if(isswarmer(O)) + return 1 + if(istype(O, /obj/item/projectile/beam/disabler)) + return 1 + +/mob/living/simple_animal/hostile/swarmer/proc/CreateSwarmer() + set name = "Replicate" + set category = "Swarmer" + set desc = "Creates a shell for a new swarmer. Swarmers will self activate." + src << "We are attempting to replicate ourselves. We will need to stand still until the process is complete." + if(resources < 50) + src << "We do not have the resources for this!" + return + if(!isturf(loc)) + src << "This is not a suitable location for replicating ourselves. We need more room." + return + if(do_mob(src, src, 100)) + if(Fabricate(/obj/item/unactivated_swarmer, 50)) + playsound(loc,'sound/items/poster_being_created.ogg',50, 1, -1) + +/mob/living/simple_animal/hostile/swarmer/proc/RepairSelf() + set name = "Self Repair" + set category = "Swarmer" + set desc = "Attempts to repair damage to our body. You will have to remain motionless until repairs are complete." + if(!isturf(loc)) + return + src << "Attempting to repair damage to our body, stand by..." + if(do_mob(src, src, 100)) + adjustBruteLoss(-100) + src << "We successfully repaired ourselves." + +/mob/living/simple_animal/hostile/swarmer/proc/ToggleLight() + if(!light_range) + set_light(3) + else + set_light(0) + +/mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers() + var/message = input(src, "Announce to other swarmers", "Swarmer contact") + if(message) + for(var/mob/M in mob_list) + if(isswarmer(M) || (M in dead_mob_list)) + M << "Swarm communication - [src] states: [message]" + + + +////HUD NONSENSE//// +/obj/screen/swarmer + icon = 'icons/mob/swarmer.dmi' + +/obj/screen/swarmer/FabricateTrap + icon_state = "ui_trap" + name = "Create trap (Costs 5 Resources)" + desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it. (Costs 5 resources)" + +/obj/screen/swarmer/FabricateTrap/Click() + if(isswarmer(usr)) + var/mob/living/simple_animal/hostile/swarmer/S = usr + S.CreateTrap() + +/obj/screen/swarmer/Barricade + icon_state = "ui_barricade" + name = "Create barricade (Costs 5 Resources)" + desc = "Creates a destructible barricade that will stop any non swarmer from passing it. Also allows disabler beams to pass through. (Costs 5 resources)" + +/obj/screen/swarmer/Barricade/Click() + if(isswarmer(usr)) + var/mob/living/simple_animal/hostile/swarmer/S = usr + S.CreateBarricade() + +/obj/screen/swarmer/Replicate + icon_state = "ui_replicate" + name = "Replicate (Costs 50 Resources)" + desc = "Creates a another of our kind." + +/obj/screen/swarmer/Replicate/Click() + if(isswarmer(usr)) + var/mob/living/simple_animal/hostile/swarmer/S = usr + S.CreateSwarmer() + +/obj/screen/swarmer/RepairSelf + icon_state = "ui_self_repair" + name = "Repair self" + desc = "Repairs damage to our body." + +/obj/screen/swarmer/RepairSelf/Click() + if(isswarmer(usr)) + var/mob/living/simple_animal/hostile/swarmer/S = usr + S.RepairSelf() + +/obj/screen/swarmer/ToggleLight + icon_state = "ui_light" + name = "Toggle light" + desc = "Toggles our inbuilt light on or off." + +/obj/screen/swarmer/ToggleLight/Click() + if(isswarmer(usr)) + var/mob/living/simple_animal/hostile/swarmer/S = usr + S.ToggleLight() + +/obj/screen/swarmer/ContactSwarmers + icon_state = "ui_contact_swarmers" + name = "Contact swarmers" + desc = "Sends a message to all other swarmers, should they exist." + +/obj/screen/swarmer/ContactSwarmers/Click() + if(isswarmer(usr)) + var/mob/living/simple_animal/hostile/swarmer/S = usr + S.ContactSwarmers() + +/datum/hud/proc/swarmer_hud(ui_style = 'icons/mob/screen1_midnight.dmi') + adding = list() + + var/obj/screen/using + + using = new /obj/screen/swarmer/FabricateTrap() + using.screen_loc = ui_rhand + adding += using + + using = new /obj/screen/swarmer/Barricade() + using.screen_loc = ui_lhand + adding += using + + using = new /obj/screen/swarmer/Replicate() + using.screen_loc = ui_zonesel + adding += using + + using = new /obj/screen/swarmer/RepairSelf() + using.screen_loc = ui_storage1 + adding += using + + using = new /obj/screen/swarmer/ToggleLight() + using.screen_loc = ui_back + adding += using + + using = new /obj/screen/swarmer/ContactSwarmers() + using.screen_loc = ui_inventory + adding += using + + mymob.client.screen = list() + //mymob.client.screen += mymob.client.void + mymob.client.screen += adding + diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer_event.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer_event.dm new file mode 100644 index 00000000000..9b245ffd856 --- /dev/null +++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer_event.dm @@ -0,0 +1,38 @@ +/datum/event/spawn_swarmer + //name = "Sawrmer Spawn" + //one_shot = 1 + startWhen = 3 //30 minutes + announceWhen = 10 + + +/datum/event/spawn_swarmer/announce() + if(prob(25)) //25% chance to announce it to the crew + var/swarmer_report = "[command_name()] High-Priority Update" + swarmer_report += "

Our long-range sensors have detected an odd signal emanating from your station's gateway. We recommend immediate investigation of your gateway, as something may have come \ + through." + for (var/obj/machinery/computer/communications/C in machines) + if(! (C.stat & (BROKEN|NOPOWER) ) ) + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) + P.name = "'Classified [command_name()] Update'" + P.info = swarmer_report + P.update_icon() + C.messagetitle.Add("Classified [command_name()] Update") + C.messagetext.Add(P.info) + command_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg') + + + +/datum/event/spawn_swarmer/start() + src << "[the_gateway]" + if(find_swarmer()) + return 0 + if(!the_gateway) + return 0 + new /obj/item/unactivated_swarmer(get_turf(the_gateway)) + + +/datum/event/spawn_swarmer/proc/find_swarmer() + for(var/mob/living/M in mob_list) + if(istype(M, /mob/living/simple_animal/hostile/swarmer) && M.client) //If there is a swarmer with an active client, we've found our swarmer + return 1 + return 0 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 8696a4b0f3c..8646cc19d66 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -57,6 +57,8 @@ //LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly var/melee_damage_lower = 0 var/melee_damage_upper = 0 + var/melee_damage_type = BRUTE //Damage type of a simple mob's melee attack, should it do damage. + var/list/ignored_damage_types = list(BRUTE = 0, BURN = 0, TOX = 0, CLONE = 0, STAMINA = 1, OXY = 0) //Set 0 to receive that damage type, 1 to ignore var/attacktext = "attacks" var/attack_sound = null var/friendly = "nuzzles" //If the mob does no damage with it's attack @@ -281,7 +283,7 @@ "\The [M] [M.attacktext] [src]!") add_logs(M, src, "attacked", admin=0) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - adjustBruteLoss(damage) + attack_threshold_check(damage,M.melee_damage_type) /mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) if(!Proj) @@ -322,7 +324,7 @@ M.do_attack_animation(src) visible_message("[M] [response_harm] [src]!") playsound(loc, "punch", 25, 1, -1) - adjustBruteLoss(harm_intent_damage) + attack_threshold_check(harm_intent_damage) return @@ -342,7 +344,7 @@ visible_message("[M] has slashed at [src]!", \ "[M] has slashed at [src]!") playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - adjustBruteLoss(damage) + attack_threshold_check(damage) return @@ -362,7 +364,7 @@ if(stat != DEAD) L.amount_grown = min(L.amount_grown + damage, L.max_grown) - adjustBruteLoss(damage) + attack_threshold_check(damage) /mob/living/simple_animal/attack_slime(mob/living/carbon/slime/M as mob) @@ -384,7 +386,7 @@ else damage = rand(5, 35) - adjustBruteLoss(damage) + attack_threshold_check(damage) return @@ -475,9 +477,22 @@ adjustBruteLoss(30) /mob/living/simple_animal/adjustBruteLoss(damage) - health = Clamp(health - damage, 0, maxHealth) - if(health < 1) - Die() + if(!ignored_damage_types[BRUTE]) + health = Clamp(health - damage, 0, maxHealth) + if(health < 1) + Die() + +/mob/living/simple_animal/adjustFireLoss(damage) + if(!ignored_damage_types[BURN]) + adjustBruteLoss(damage) + +/mob/living/simple_animal/adjustToxLoss(damage) + if(!ignored_damage_types[TOX]) + ..(damage) + +/mob/living/simple_animal/adjustCloneLoss(damage) + if(!ignored_damage_types[CLONE]) + ..(damage) /mob/living/simple_animal/proc/CanAttack(var/atom/the_target) if(see_invisible < the_target.invisibility) @@ -496,6 +511,12 @@ return 0 return 1 +/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE) + if(damage <= force_threshold || ignored_damage_types[damagetype]) + visible_message("[src] looks unharmed.") + else + adjustBruteLoss(damage) + /mob/living/simple_animal/update_fire() return diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 9a5ce12d904..795027e55b6 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -137,6 +137,11 @@ proc/isembryo(A) return 1 return 0 +/proc/isswarmer(A) + if(istype(A, /mob/living/simple_animal/hostile/swarmer)) + return 1 + return 0 + proc/isobserver(A) if(istype(A, /mob/dead/observer)) return 1 diff --git a/icons/mob/swarmer.dmi b/icons/mob/swarmer.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5a3595f7baf7f0a694643806cf34fa725dd2f03a GIT binary patch literal 15477 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
tj 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

($fNTlqn~yxA$s&F;x_(S)Pvu(?mnjT6J{b z0>3(A5$D&5*U(zC7Qoa?CjB&I=Aq5|>_!`o8+RDR?7|vxY}HQaO-X&&9`kd20kq}_ zUtn?&1q3~wxgm5RPi^$a)gYUsK4c7ifFav{fhA+f+@IbOp&BXt@P67W0ou;}eGZEk zMd|0lCRY?(9_^(nearf8oI=f%M<$NXB*r--9#49%Pk*z0??u(T(hC+Q4DcM$FpSds z`5xC#9T5^^t5fmA{TQlU-hugspxY-7;sh$}=JMMvI*dg%*F7S$A~w&n^U^sR*Vya1 z14sCJ3wh3Qft~4QY+X6eM2uEemC>G*L`??6SRfF_0For2|gwInvL)z{SN(b8X9 zLn8LtyUA0>lj2hfnytv66+Z(Uva>wi!`we1v4We-B|*RBBiAU120&`H0R*#hbA)t=cz(<-P3+T?|}cb!pR%<&K#m)@7KQswx}T;=n-CJtRsoN2mOm zxlTLV6?R~^y`}>vk^qcC?ji1A367?=R`*eD4FC(T zAML>5HOu1RwJ%Q>-{~B|VG$b!dT#|2z>B0Z->-I-yPp-sJ*c~XMdnpT|MJgad6(;v zuv7B|+at13pH`aU%*;5E-|2Qef;R@>`i@+FNxQdhLhC*`HX0Va4XU>x>+@&TM?q=t zHU>6!JKzIJgBm8k`M_H9r0Cb8&x_7-gmEz0g2x9;$Uom8Jry)?1AjdaS(|ors(z=w zZ|{%Cuhq=sdckP!xTg`f!S-#O&EiGG8pQklgpLFIxdP4;U$pUchWl~UUj$}oGj%G> z0{_Wp4nvj%8X_2X7LfxhzNZ8=qby|${<(oraGtZUPyJw#@2+R(n@X1rm&8Q2NZOmz z0E8&ev6FCr(bMD}SfJ)~wj2FONAz`#1Tp0A$mbI25_{B_9q~d|-x$-KlgCZ%*Oz?| z*`Lb+#F9T^15hh#0bip5^`3s^b9AeG?H}DVUEPIC!K}XJD`WkVx}u@F>F|9?K}l3r z7OAqbMD2;=Y=xBjO2u0&6_`YHLc;wL!+T#LE9T@Mi}JRT50E|_=%A)p`CJf=SGt6*E z+lw@uLECENoaC+O8aAeBU3fRO9NPnASw^HX}Ls>`=ki=o!% z^oKs}j`}O#sk=@3)kjTYpE@p~^=#tV4{?xpq%0_RgKlf}H1J6`Fk&4dJ42ff7pi^0 z^k=CX#*vdzf#{n|_QN}GgOksHKjue^=!+hy9z?=FaHL}|fN7{Zz^!w~x1&N*2-eIS z&)d5A9?Yz`uH5C&^ap?VBjN0(hwRNO>wFDSBP5DLH+&_bGN+cG#5MMhzs?-BI8sM( z{Ty1mEs^aUyYRR@Pn`O=M5oTn&W3mZwV!0w%J=+WEQ1*GV=XBnxBC5?eOA41b9E0^ z`#-zl8r~n_6~uW|8l%)BLHWW>n4TAUuHeoQmqWCuY}=G%mh-IdQ+god`f=f8_E|nb zoY?QD6X~5*t3=)%nxnYjR8zo(F$xl$FnnNMtuM5syz|6~RU-1&->9|pKl)~?3HYIG zNts{_xGlCF>29kT@djT{f}3_wT-+D;L^mm`Sr*P-YV244NdR4vLMKI-ZtAxCPh+aA z!mUgPe_?o)i=sBOpltB(kJK^*O16TN;*yyPqv}*8dE(D2Z%gR^dELQSSJ77uy}KLs zr@Ra*w`t{N*Yvur37H-4ksp3dl*J&~dfw#LR3ObtU;vx^P+-roYeT2l*7t1nnNJeW z+=UyH&jW?xt?uo#3~X~@?@alNpR;{t(N~F?%?viF*ws4f_-p0nku>9(Br7r(nCV|m z?^v1^o+T|*B*$e?Qb#9@IG#wpOI5Gom)H+@qW_Rtz&i>)AwkGZ>~-=7Lp5mS(P59z zQ84Jk?8Jxa@%U0`xh~!MuB|#R+?EdBe__Qth%c7Wm)Al}zQAFTo{Y*Qd)Yr4lteug zB#%?AU)FHiUf@kRG`*j=De|-IO4=g3AeIN0Q)WmVOx=2eQt(+9LBf0BITdbp#5mlo|_uSo`%9iB|GtT?a;GhlJmWx2%c8h(>b@9JuWi`$~iL#w=j2 ztsOh@mhN~EkhpT_DsCVHb21+%H_6v5O%qUCuMVFb$Ez9yh{m^pA zrkKsRxC5nAWI>(ImUnLWv1KA0QR z`t1amKjpSmSWs3f$9jKzvaiA$B~1cGuYWN4Pf!&)K4IATHFa_@*%=e2%?`VH2Y7kE zv{HQHw$$rF6?Jg)WjCM+e4R<;;G4i1{N4{jLprSc{sR5dQ;)(!qU^E$Y|cq~kQ_hC zFMvojMA~EJia$(hyRJb@P&s8J#DI{{8OP8z0?{1JBaWbJ=5vwT|^&^&H zyNE&QaTZFUI;&3VU)W4{e{hu%N*B1OQZ@1%N|WGI^aYRoySYA4CcZF7KEcLP+Tde; zri4_(hjq$0y$iQ^<>Gjo#{yEi=AAWxRUZtgW52nuE_T;as&Q%FDe}9s%2jrRn>ZL6 zK8->8QIOJ*N-0B zwMN}m!+}+6|9uTOG6=bSG@K?_{o|2^Yf|YG27L+OyG%h&WFk~i|M!bc|0$!iBQ-u9L z-yHbgx%KkrhULz1Z2kSt6HOThxnnf z+w17S#|oB50%{{+1F=!eU`cHzMGsVwwFPH#=8BUHsSS0F98ockwrD4n5i+~dWtb+! z3Y=LPRN9!_t#;70Xx9ms*b9{(wUD@;pC0iOl&E1bb6DRt+ciUj`$F}^qS$vGq z4{V6I@jQG;&L`PO$SL#af4@HVAJ*u9Y(Boh7 Date: Sun, 11 Oct 2015 22:57:18 -0400 Subject: [PATCH 2/7] Updating for Pull refactor I realease a swarmer a day on github until this is merged. --- code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm index 9e01622efc4..fcd66d3f790 100644 --- a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm +++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm @@ -77,7 +77,7 @@ /mob/living/simple_animal/hostile/swarmer/New() ..() add_language("Swarmer", 1) - verbs -= /atom/movable/verb/pull + verbs -= /mob/living/verb/pulled updatename() /mob/living/simple_animal/hostile/swarmer/Stat() From d141945b10a9050d2bc4db7ae0d3532c232a7446 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Tue, 13 Oct 2015 23:01:28 -0400 Subject: [PATCH 3/7] Changed based on feedback --- code/game/machinery/machinery.dm | 6 +----- .../objects/structures/crates_lockers/closets.dm | 4 ++-- code/modules/mob/language.dm | 2 +- .../simple_animal/bot_swarm/swarmer_event.dm | 1 - .../mob/living/simple_animal/simple_animal.dm | 15 ++++++++++++--- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index a0b84ea2575..16e3fb56d23 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -329,11 +329,7 @@ Class Procs: var/turf/T = get_turf(src) for(var/atom/movable/AM in contents) AM.forceMove(T) - //if(occupant) - // if(occupant.client) - // occupant.client.eye = occupant - // occupant.client.perspective = MOB_PERSPECTIVE - // occupant = null + //////////////////////////////////////////////////////////////////////////////////////////// /obj/machinery/attack_ai(var/mob/user as mob) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index c96af327e04..a596db41b82 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -142,14 +142,14 @@ for (var/atom/movable/A as mob|obj in src) A.forceMove(loc) A.ex_act(severity++) - new /obj/item/stack/sheet/metal(loc) + new /obj/item/stack/sheet/metal(loc) qdel(src) if(3) if(prob(5)) for(var/atom/movable/A as mob|obj in src) A.forceMove(loc) A.ex_act(severity++) - new /obj/item/stack/sheet/metal(loc) + new /obj/item/stack/sheet/metal(loc) qdel(src) /obj/structure/closet/bullet_act(var/obj/item/projectile/Proj) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 03ed2d630b4..d50d2f7ce59 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -515,7 +515,7 @@ ask_verb = "tones" exclaim_verb = "tones" colour = "say_quote" - key = "z"//Zwarmer...Or Zerg! + key = "zw"//Zwarmer...Or Zerg! flags = RESTRICTED || HIVEMIND follow = 1 diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer_event.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer_event.dm index 9b245ffd856..72c1c5050f0 100644 --- a/code/modules/mob/living/simple_animal/bot_swarm/swarmer_event.dm +++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer_event.dm @@ -23,7 +23,6 @@ /datum/event/spawn_swarmer/start() - src << "[the_gateway]" if(find_swarmer()) return 0 if(!the_gateway) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 8646cc19d66..954aaa7f77b 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -511,11 +511,20 @@ return 0 return 1 -/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE) - if(damage <= force_threshold || ignored_damage_types[damagetype]) +/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype) + if(damage <= force_threshold) visible_message("[src] looks unharmed.") else - adjustBruteLoss(damage) + switch(damagetype) + if(BRUTE) + adjustBruteLoss(damage) + if(BURN) + adjustFireLoss(damage) + if(TOX) + adjustToxLoss(damage) + if(CLONE) + adjustCloneLoss(damage) + /mob/living/simple_animal/update_fire() return From 1404c88229dc8f4cee571e13d372e9cc85f72771 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Mon, 19 Oct 2015 08:27:06 -0400 Subject: [PATCH 4/7] fixes will still need to look at using transfer_to and the language key --- code/game/objects/structures/girders.dm | 2 +- .../structures/stool_bed_chair_nest/stools.dm | 6 +++-- code/modules/mob/language.dm | 2 +- .../living/simple_animal/bot_swarm/swarmer.dm | 22 +++++++++++-------- .../living/simple_animal/hostile/hostile.dm | 17 +++++++------- .../mob/living/simple_animal/simple_animal.dm | 2 +- 6 files changed, 28 insertions(+), 23 deletions(-) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index ddd121434d2..19c2dd13ec8 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -184,7 +184,7 @@ qdel(src) return if(3.0) - if (prob(30)) + if (prob(40)) var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal) new remains(loc) qdel(src) diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index 890d84a1f70..efdadfbb7c2 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -11,11 +11,13 @@ qdel(src) return if(2.0) - if (prob(50)) + if (prob(70)) + new /obj/item/stack/sheet/metal(src.loc) qdel(src) return if(3.0) - if (prob(5)) + if (prob(50)) + new /obj/item/stack/sheet/metal(src.loc) qdel(src) return return diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index d50d2f7ce59..03ed2d630b4 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -515,7 +515,7 @@ ask_verb = "tones" exclaim_verb = "tones" colour = "say_quote" - key = "zw"//Zwarmer...Or Zerg! + key = "z"//Zwarmer...Or Zerg! flags = RESTRICTED || HIVEMIND follow = 1 diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm index fcd66d3f790..530409bd517 100644 --- a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm +++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm @@ -10,12 +10,14 @@ ..() /obj/item/unactivated_swarmer/Topic(href, href_list) + if(..()) + return 1 if(href_list["ghostjoin"]) var/mob/dead/observer/ghost = usr if(istype(ghost)) attack_ghost(ghost) -/obj/item/unactivated_swarmer/attack_ghost(mob/user) +/obj/item/unactivated_swarmer/attack_ghost(mob/user as mob) var/be_swarmer = alert("Become a swarmer? (Warning, You can no longer be cloned!)",,"Yes","No") if(be_swarmer == "No") return @@ -44,6 +46,14 @@ harm_intent_damage = 5 minbodytemp = 0 maxbodytemp = 500 + min_oxy = 0 + max_oxy = INFINITY + min_tox = 0 + max_tox = INFINITY + min_co2 = 0 + max_co2 = INFINITY + min_n2 = 0 + max_n2 = INFINITY unsuitable_atmos_damage = 0 melee_damage_lower = 15 melee_damage_upper = 15 @@ -59,7 +69,6 @@ pass_flags = PASSTABLE ventcrawler = 2 ranged = 1 - projectiletype = /obj/item/projectile/beam/disabler ranged_cooldown_cap = 2 projectilesound = 'sound/weapons/taser2.ogg' AIStatus = AI_OFF @@ -224,7 +233,7 @@ /mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisperseTarget(src) -/mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) +/mob/living/carbon/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S << "This biological resource is somehow resisting our bluespace transceiver. Aborting." ////END CTRL CLICK FOR SWARMERS//// @@ -252,7 +261,6 @@ var/obj/effect/swarmer/integrate/I = new /obj/effect/swarmer/integrate(get_turf(target)) I.pixel_x = target.pixel_x I.pixel_y = target.pixel_y - I.pixel_z = target.pixel_z if(istype(target, /obj/item/stack)) var/obj/item/stack/S = target S.use(1) @@ -268,7 +276,6 @@ do_attack_animation(target) changeNext_move(CLICK_CD_MELEE) target.ex_act(3) - return /mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(var/mob/living/target) if(target != src) @@ -290,8 +297,7 @@ if((pressure > 20) && (pressure < 550))//Account for crushing pressure or vaccuums if(ishuman(target))//If we're getting rid of a human, slap some zipties on them to keep them away from us a little longer var/obj/item/weapon/restraints/handcuffs/cable/zipties/Z = new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) - var/mob/living/carbon/human/H = target - Z.apply_cuffs(H, src) + Z.apply_cuffs(target, src) do_teleport(target, F, 0) playsound(src,'sound/effects/sparks4.ogg',50,1) break @@ -303,7 +309,6 @@ var/obj/effect/swarmer/dismantle/D = new /obj/effect/swarmer/dismantle(get_turf(target)) D.pixel_x = target.pixel_x D.pixel_y = target.pixel_y - D.pixel_z = target.pixel_z if(do_mob(src, target, 100)) src << "Dismantling complete." var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc) @@ -314,7 +319,6 @@ var/obj/effect/swarmer/disintegration/N = new /obj/effect/swarmer/disintegration(get_turf(target)) N.pixel_x = target.pixel_x N.pixel_y = target.pixel_y - N.pixel_z = target.pixel_z target.dropContents() if(istype(target, /obj/machinery/computer)) var/obj/machinery/computer/C = target diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 125d4007879..7694f714aca 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -253,22 +253,21 @@ var/target = the_target visible_message("[src] [ranged_message] at [target]!") - var/tturf = get_turf(target) if(rapid) spawn(1) - Shoot(tturf, src.loc, src) + Shoot(target, src.loc, src) if(casingtype) new casingtype(get_turf(src)) spawn(4) - Shoot(tturf, src.loc, src) + Shoot(target, src.loc, src) if(casingtype) new casingtype(get_turf(src)) spawn(6) - Shoot(tturf, src.loc, src) + Shoot(target, src.loc, src) if(casingtype) new casingtype(get_turf(src)) else - Shoot(tturf, src.loc, src) + Shoot(target, src.loc, src) if(casingtype) new casingtype ranged_cooldown = ranged_cooldown_cap @@ -278,17 +277,17 @@ if(target == start) return - var/obj/item/projectile/A = new projectiletype(user:loc) + var/obj/item/projectile/A = new projectiletype(src.loc) playsound(user, projectilesound, 100, 1) if(!A) return - if (!istype(target, /turf)) - qdel(A) - return A.current = target A.firer = src A.yo = target:y - start:y A.xo = target:x - start:x + if(AIStatus == AI_OFF)//Don't want mindless mobs to have their movement screwed up firing in space + newtonian_move(get_dir(target, user)) + A.original = target spawn( 0 ) A.process() return diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 9ca93519fb5..a7d3051a2c6 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -513,7 +513,7 @@ /mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype) if(damage <= force_threshold) - visible_message("[src] looks unharmed.") + visible_message("[src] looks unharmed from the damage.") else switch(damagetype) if(BRUTE) From c767da2de9063bdaffb0231398ad6d6aa8bf3c36 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Sun, 1 Nov 2015 07:01:12 -0500 Subject: [PATCH 5/7] Reviewed TG Simple animal file made changes. --- code/modules/mob/living/simple_animal/simple_animal.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index a7d3051a2c6..e049182cac0 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -478,13 +478,11 @@ /mob/living/simple_animal/adjustBruteLoss(damage) if(!ignored_damage_types[BRUTE]) - health = Clamp(health - damage, 0, maxHealth) - if(health < 1) - Die() + ..() /mob/living/simple_animal/adjustFireLoss(damage) if(!ignored_damage_types[BURN]) - adjustBruteLoss(damage) + ..(damage) /mob/living/simple_animal/adjustToxLoss(damage) if(!ignored_damage_types[TOX]) From 05f9c085a6ff95270522e1ccc4354725348d3c35 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Tue, 3 Nov 2015 08:26:32 -0500 Subject: [PATCH 6/7] another change --- .../mob/living/simple_animal/simple_animal.dm | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index e049182cac0..2d386413230 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -509,19 +509,12 @@ return 0 return 1 -/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype) - if(damage <= force_threshold) +/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE) + if(damage <= force_threshold || ignored_damage_types[damagetype]) visible_message("[src] looks unharmed from the damage.") else - switch(damagetype) - if(BRUTE) - adjustBruteLoss(damage) - if(BURN) - adjustFireLoss(damage) - if(TOX) - adjustToxLoss(damage) - if(CLONE) - adjustCloneLoss(damage) + adjustBruteLoss(damage) + updatehealth()) /mob/living/simple_animal/update_fire() From 07999f0792d7e10da4982b0abaad4f503908b6fe Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Tue, 3 Nov 2015 15:25:01 -0500 Subject: [PATCH 7/7] don't code half awake --- code/modules/mob/living/simple_animal/simple_animal.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 2d386413230..e5852d0f784 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -514,7 +514,7 @@ visible_message("[src] looks unharmed from the damage.") else adjustBruteLoss(damage) - updatehealth()) + updatehealth() /mob/living/simple_animal/update_fire()