From 20ba3071edd9cd32f89d8152406498e356412a94 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Mon, 24 Aug 2015 07:52:54 -0300 Subject: [PATCH 1/8] Fixes the brand intelligence event not triggering the uprising under certain conditions. Adds a new proc for the list helpers, removeNullsFromList() It does what it says. --- code/__HELPERS/lists.dm | 8 +++++++- code/modules/events/brand_intelligence.dm | 6 +----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 2ec7b4c407f..66ae50cf852 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -342,4 +342,10 @@ for(var/datum/D in L) if(D.vars.Find(varname)) if(D.vars[varname] == value) - return D \ No newline at end of file + return D + +//remove all nulls from a list +/proc/removeNullsFromList(list/L) + while(L.Remove(null)) + continue + return L \ No newline at end of file diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 9a55d77b4ad..f373fad4af6 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -7,7 +7,6 @@ /datum/round_event/brand_intelligence announceWhen = 21 endWhen = 1000 //Ends when all vending machines are subverted anyway. - var/list/obj/machinery/vending/vendingMachines = list() var/list/obj/machinery/vending/infectedMachines = list() var/obj/machinery/vending/originMachine @@ -28,11 +27,9 @@ for(var/obj/machinery/vending/V in machines) if(V.z != 1) continue vendingMachines.Add(V) - if(!vendingMachines.len) kill() return - originMachine = pick(vendingMachines) vendingMachines.Remove(originMachine) originMachine.shut_up = 0 @@ -48,7 +45,7 @@ originMachine.visible_message("[originMachine] beeps and seems lifeless.") kill() return - + vendingMachines = removeNullsFromList(vendingMachines) if(!vendingMachines.len) //if every machine is infected for(var/obj/machinery/vending/upriser in infectedMachines) if(prob(70) && !upriser.gc_destroyed) @@ -62,7 +59,6 @@ kill() return - if(IsMultiple(activeFor, 4)) var/obj/machinery/vending/rebel = pick(vendingMachines) vendingMachines.Remove(rebel) From ce8722b86898c412c5fb2af1cf60ec7eefd4b262 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Mon, 24 Aug 2015 21:36:50 -0400 Subject: [PATCH 2/8] Fixes burn kits containing salicyclic acid pills. --- code/game/objects/items/weapons/storage/firstaid.dm | 4 ++-- code/modules/reagents/reagent_containers/pill.dm | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index f1347bcd07e..16b4767ceba 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -45,8 +45,8 @@ new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/weapon/reagent_containers/pill/salicyclic(src) - new /obj/item/weapon/reagent_containers/pill/salicyclic(src) + new /obj/item/weapon/reagent_containers/pill/kelotane(src) + new /obj/item/weapon/reagent_containers/pill/kelotane(src) new /obj/item/weapon/reagent_containers/hypospray/medipen(src) new /obj/item/device/healthanalyzer(src) return diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 2a99e768c75..8246b5a7eb7 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -134,6 +134,13 @@ list_reagents = list("sal_acid" = 24) roundstart = 1 +/obj/item/weapon/reagent_containers/pill/kelotane + name = "kelotane pill" + desc = "Catalyzes the healing of burns." + icon_state = "pill5" + list_reagents = list("kelotane" = 20) + roundstart = 1 + /obj/item/weapon/reagent_containers/pill/insulin name = "insulin pill" desc = "Handles hyperglycaemic coma." From 132adf3f0045ff16e314ff1922b7d8f025fa7315 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Mon, 24 Aug 2015 21:45:18 -0400 Subject: [PATCH 3/8] adds silver sulf syringes instead of kelotane pills --- code/game/objects/items/weapons/storage/firstaid.dm | 4 ++-- code/modules/reagents/reagent_containers/pill.dm | 7 ------- code/modules/reagents/reagent_containers/syringes.dm | 5 +++++ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 16b4767ceba..1b285543b59 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -45,8 +45,8 @@ new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/weapon/reagent_containers/pill/kelotane(src) - new /obj/item/weapon/reagent_containers/pill/kelotane(src) + new /obj/item/weapon/reagent_containers/syringe/silver_sulf(src) + new /obj/item/weapon/reagent_containers/syringe/silver_sulf(src) new /obj/item/weapon/reagent_containers/hypospray/medipen(src) new /obj/item/device/healthanalyzer(src) return diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 8246b5a7eb7..2a99e768c75 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -134,13 +134,6 @@ list_reagents = list("sal_acid" = 24) roundstart = 1 -/obj/item/weapon/reagent_containers/pill/kelotane - name = "kelotane pill" - desc = "Catalyzes the healing of burns." - icon_state = "pill5" - list_reagents = list("kelotane" = 20) - roundstart = 1 - /obj/item/weapon/reagent_containers/pill/insulin name = "insulin pill" desc = "Handles hyperglycaemic coma." diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 46b77827093..d55336243bc 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -216,6 +216,11 @@ desc = "Contains charcoal." list_reagents = list("charcoal" = 15) +/obj/item/weapon/reagent_containers/syringe/silver_sulf + name = "syringe (charcoal)" + desc = "Contains silver sulfadiazine." + list_reagents = list("silver_sulfadiazine" = 15) + /obj/item/weapon/reagent_containers/syringe/antiviral name = "syringe (spaceacillin)" desc = "Contains antiviral agents." From 2c56462e97119d9a192f8124dc6e1d3596520a2a Mon Sep 17 00:00:00 2001 From: bgobandit Date: Mon, 24 Aug 2015 22:45:37 -0400 Subject: [PATCH 4/8] I sure do love me some copypasta --- code/modules/reagents/reagent_containers/syringes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index d55336243bc..6f5e5bb1c7a 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -217,7 +217,7 @@ list_reagents = list("charcoal" = 15) /obj/item/weapon/reagent_containers/syringe/silver_sulf - name = "syringe (charcoal)" + name = "syringe (silver sulfadiazine)" desc = "Contains silver sulfadiazine." list_reagents = list("silver_sulfadiazine" = 15) From 460c2c290c216e1b473897c773e83f5df1925490 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Tue, 25 Aug 2015 05:31:02 -0300 Subject: [PATCH 5/8] Fixes the admin message not appearing under certain conditions when the rapid dupe experimentator relic is used. All objects from said relic will spawn at the same time now. --- code/modules/research/experimentor.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index e57a3762319..acb72b88205 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -703,7 +703,8 @@ R.realProc = realProc R.revealed = TRUE dupes |= R - R.throw_at(pick(oview(7,get_turf(src))),10,1) + spawn() + R.throw_at(pick(oview(7,get_turf(src))),10,1) counter = 0 spawn(rand(10,100)) for(counter = 1; counter <= dupes.len; counter++) From 9572bd6aa65bd81dd1bf0f97a6d9d72adbd9d4a0 Mon Sep 17 00:00:00 2001 From: Ergovisavi Date: Tue, 25 Aug 2015 03:24:34 -0700 Subject: [PATCH 6/8] -First revision of Swarmer mob, hud, icons, etc -Adds functionality of ignored damage types to simple mobs -Adds functionality of melee damage types to simple mobs --- code/_onclick/hud/hud.dm | 2 + code/game/machinery/doors/windowdoor.dm | 6 +- .../structures/crates_lockers/closets.dm | 1 + .../structures/stool_bed_chair_nest/stools.dm | 6 +- code/game/objects/structures/window.dm | 2 +- .../mob/living/carbon/alien/alien_defense.dm | 14 +- code/modules/mob/living/carbon/carbon.dm | 4 +- code/modules/mob/living/carbon/human/human.dm | 4 +- .../mob/living/carbon/human/human_defense.dm | 2 +- .../mob/living/carbon/monkey/monkey.dm | 14 +- code/modules/mob/living/silicon/silicon.dm | 14 +- .../living/simple_animal/bot_swarm/swarmer.dm | 419 ++++++++++++++++++ .../mob/living/simple_animal/simple_animal.dm | 23 +- code/modules/mob/mob_helpers.dm | 5 + icons/mob/swarmer.dmi | Bin 0 -> 12804 bytes tgstation.dme | 1 + 16 files changed, 498 insertions(+), 19 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm create mode 100644 icons/mob/swarmer.dmi diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index fb209d087e7..d947bfa6553 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -197,6 +197,8 @@ var/datum/global_hud/global_hud = new() blob_hud() else if(isdrone(mymob)) drone_hud(ui_style) + else if(isswarmer(mymob)) + swarmer_hud() //Version denotes which style should be displayed. blank or 0 means "next version" diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 82a66b848e1..fbf9c5b26f3 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -235,10 +235,8 @@ return var/mob/living/simple_animal/M = user M.do_attack_animation(src) - 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/simple_animal/slime/user) user.do_attack_animation(src) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index bb209cb9515..8fa1375a480 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -166,6 +166,7 @@ /obj/structure/closet/ex_act(severity, target) contents_explosion(severity, target) + new /obj/item/stack/sheet/metal(loc) dump_contents() 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 696ed292eb9..b7862562752 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(loc) qdel(src) return if(3.0) - if (prob(5)) + if (prob(50)) + new /obj/item/stack/sheet/metal(loc) qdel(src) return return diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 6c02cd7e7d0..9dc8d6631e9 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -168,7 +168,7 @@ var/mob/living/simple_animal/M = user 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 attack_generic(M, M.melee_damage_upper) diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index fd3fff64a4b..20577531b27 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -73,7 +73,19 @@ In all, this is a lot like the monkey code. /N /mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M) 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() /mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 8fdb1c39ccf..7459a055067 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -74,9 +74,9 @@ . = ..() -/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0) +/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0, override = 0) shock_damage *= siemens_coeff - if (shock_damage<1) + if(shock_damage<1 && !override) return 0 take_overall_damage(0,shock_damage) //src.burn_skin(shock_damage) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 795c7e68da7..4679a8d33e5 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -270,7 +270,7 @@ spreadFire(AM) //Added a safety check in case you want to shock a human mob directly through electrocute_act. -/mob/living/carbon/human/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0, safety = 0) +/mob/living/carbon/human/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0, safety = 0, override = 0) if(!safety) if(gloves) var/obj/item/clothing/gloves/G = gloves @@ -280,7 +280,7 @@ heart_attack = 0 if(stat == CONSCIOUS) src << "You feel your heart beating again!" - return ..(shock_damage,source,siemens_coeff) + return ..(shock_damage,source,siemens_coeff,safety,override) /mob/living/carbon/human/Topic(href, href_list) if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 7a39b9969fe..98a8c3b6eed 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -389,7 +389,7 @@ emp_act var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone)) var/armor = run_armor_check(affecting, "melee") - apply_damage(damage, BRUTE, affecting, armor) + apply_damage(damage, M.melee_damage_type, affecting, armor) updatehealth() diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 5f721ecb512..bd9a1af5f52 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -155,7 +155,19 @@ /mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M) 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() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 83b20b450cb..1a42c2e82f2 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -381,7 +381,19 @@ /mob/living/silicon/attack_animal(mob/living/simple_animal/M) 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() /mob/living/silicon/attack_paw(mob/living/user) 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..c59d080c862 --- /dev/null +++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm @@ -0,0 +1,419 @@ +////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/attack_ghost(mob/user) + var/be_swarmer = alert("Become a swarmer? (Warning, You can no longer be cloned!)",,"Yes","No") + if(be_swarmer == "No" || gc_destroyed) + 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" + 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 = 30 + maxHealth = 30 + status_flags = CANPUSH + icon_state = "swarmer" + icon_living = "swarmer" + icon_dead = "swarmer_unactivated" + icon_gib = null + wander = 0 + harm_intent_damage = 5 + minbodytemp = 0 + maxbodytemp = 500 + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + unsuitable_atmos_damage = 0 + melee_damage_lower = 15 + melee_damage_upper = 15 + melee_damage_type = STAMINA + ignored_damage_types = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) + environment_smash = 0 + attacktext = "shocks" + attack_sound = null + friendly = "pinches" + speed = 0 + faction = list("swarmer") + AIStatus = AI_OFF + projectiletype = /obj/item/projectile/beam/disabler + pass_flags = PASSTABLE | PASSMOB + has_unlimited_silicon_privilege = 1 + ventcrawler = 2 + ranged = 1 + projectiletype = /obj/item/projectile/beam/disabler + ranged_cooldown_cap = 2 + projectilesound = 'sound/weapons/taser2.ogg' + 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, or destroying the environment." + 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 resources will be harvested at a later date, do not harm them." + +/mob/living/simple_animal/hostile/swarmer/New() + ..() + verbs -= /mob/living/verb/pulled + +/mob/living/simple_animal/hostile/swarmer/Stat() + ..() + if(statpanel("Status")) + stat("Resources",resources) + +/mob/living/simple_animal/hostile/swarmer/death(gibbed) + ..(gibbed) + new /obj/effect/decal/cleanable/robot_debris(src.loc) + ghostize() + qdel(src) + +/mob/living/simple_animal/hostile/swarmer/emp_act() + if(health > 1) + health = 1 + ..() + health = 0 + +/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 + if(isliving(A)) + DisperseTarget(A) + return + if(istype(A, /obj/item)) + Integrate(A) + return + if(istype(A, /turf/simulated/floor))//Stops you from disintegrating mobs to death or other assorted nonsense, as turf ex_act calls it on its contents + return + DisIntegrate(A) + return + +/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 + if(istype(target, /obj/item/weapon/gun)) + src << "This object has been adjusted to resist disintegration"//Stops swarmers from devouring the entire armory in seconds + return + if((target.materials[MAT_METAL]) || (target.materials[MAT_GLASS])) + if(istype(target, /obj/item/stack)) + if(istype(target, /obj/item/stack/cable_coil))//Wiring is just too plentiful + src << "This object does not contain enough materials to work with." + return + var/obj/item/stack/S = target + resources++ + S.amount-- + if(S.amount > 0) + return + resources++ + do_attack_animation(target) + qdel(target) + else + src << "This object does not contain enough materials to work with." + return + +/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(var/atom/movable/target) + if(istype(target, /turf/simulated/wall) || istype(target, /obj/structure/window)) + if(locate(/turf/space) in range(1, target)) + src << "Destroying this object has the potential to cause a hull breach. Aborting." + return + if(istype(target, /obj/structure/reagent_dispensers/fueltank)) + src << "Destroying this object would cause a chain reaction. Aborting." + return + if(istype(target, /obj/machinery/portable_atmospherics/canister)) + src << "An inhospitable area may be created as a result of destroying this object. Aborting." + return + if(istype(target, /obj/structure/cable) || istype(target, /obj/machinery/power/apc) || istype(target, /obj/machinery/power/smes)) + src << "Disrupting the power grid would bring no benefit to us. Aborting." + return + if(istype(target, /obj/machinery/power/emitter))//Stop trying to release the singularity you fuck + src << "This object is too risky to destroy. Aborting." + return + new /obj/effect/effect/sparks(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(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 + +/obj/effect/swarmer //Default destroyable object for swarmer constructions + name = "swarmer construction" + desc = "Debug swarmer item, this shouldn't be here. Yell at a coder." + gender = NEUTER + icon = 'icons/mob/swarmer.dmi' + icon_state = "ui_light" + luminosity = 1 + var/health = 30 + +/obj/effect/swarmer/proc/TakeDamage(damage) + health -= damage + if(health <= 0) + qdel(src) + +/obj/effect/swarmer/bullet_act(obj/item/projectile/Proj) + if(Proj.damage) + if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + TakeDamage(Proj.damage) + ..() + +/obj/effect/swarmer/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/ex_act() + qdel(src) + return + +/obj/effect/swarmer/blob_act() + qdel(src) + return + +/obj/effect/swarmer/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/trap in loc) + src << "There is already a trap here. Aborting." + return + Fabricate(/obj/effect/swarmer/trap, 5) + return + +/obj/effect/swarmer/trap + name = "swarmer trap" + desc = "A quickly assembled electric trap. Will not retain its form if damaged enough." + icon_state = "trap" + luminosity = 1 + health = 10 + +/obj/effect/swarmer/trap/Crossed(var/atom/movable/AM) + if(isliving(AM)) + var/mob/living/L = AM + if(!istype(L, /mob/living/simple_animal/hostile/swarmer)) + L.electrocute_act(0, src, 1, 1) + 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/blockade in loc) + src << "There is already a blockade here. Aborting." + return + Fabricate(/obj/effect/swarmer/blockade, 5) + return + +/obj/effect/swarmer/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" + luminosity = 1 + health = 50 + density = 1 + anchored = 1 + +/obj/effect/swarmer/blockade/CanPass(atom/movable/O) + if(istype(O, /mob/living/simple_animal/hostile/swarmer)) + 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(!luminosity) + SetLuminosity(3) + else + SetLuminosity(0) + +/mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers() + var/message = input(src, "Announce to other swarmers", "Swarmer contact") + if(message) + for(var/mob/living/simple_animal/hostile/swarmer/S in world) + if(S != src) + S << "Swarm communication: [message]" + + +////HUD NONSENSE//// +/obj/screen/swarmer + icon = 'icons/mob/swarmer.dmi' + +/obj/screen/swarmer/FabricateTrap + icon_state = "ui_trap" + name = "Create trap" + 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" + 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" + desc = "Creates a another of our kind. (Costs 50 resources)" + +/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/screen_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/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 6a9927b9fc3..7c03a9fa427 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -41,6 +41,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 = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) //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 @@ -252,7 +254,7 @@ /mob/living/simple_animal/attack_animal(mob/living/simple_animal/M) if(..()) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - attack_threshold_check(damage) + attack_threshold_check(damage,M.melee_damage_type) return 1 /mob/living/simple_animal/bullet_act(obj/item/projectile/Proj) @@ -262,8 +264,21 @@ Proj.on_hit(src) return 0 +/mob/living/simple_animal/adjustBruteLoss(amount) + if(!ignored_damage_types[BRUTE]) + ..() + /mob/living/simple_animal/adjustFireLoss(amount) - adjustBruteLoss(amount) + if(!ignored_damage_types[BURN]) + adjustBruteLoss(amount) + +/mob/living/simple_animal/adjustToxLoss(amount) + if(!ignored_damage_types[TOX]) + ..(amount) + +/mob/living/simple_animal/adjustCloneLoss(amount) + if(!ignored_damage_types[CLONE]) + ..(amount) /mob/living/simple_animal/adjustStaminaLoss(amount) return @@ -333,8 +348,8 @@ attack_threshold_check(damage) return 1 -/mob/living/simple_animal/proc/attack_threshold_check(damage) - 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.") else adjustBruteLoss(damage) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 857b7f35181..c53fa9b1d3a 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -125,6 +125,11 @@ return 1 return 0 +/proc/isswarmer(A) + if(istype(A, /mob/living/simple_animal/hostile/swarmer)) + return 1 + return 0 + /proc/islimb(A) if(istype(A, /obj/item/organ/limb)) return 1 diff --git a/icons/mob/swarmer.dmi b/icons/mob/swarmer.dmi new file mode 100644 index 0000000000000000000000000000000000000000..96a9f9ae09e1870344142cbb3439434468f5082e GIT binary patch literal 12804 zcmaL8by!qw^ftPO8hS{T21x-yx|yLnRU{+?1ZkvuMnn(=X%z*A5D){9kZ$SDk#1q6 z2asmY=KY=TT<5yZ_nm+C>^-xeUeA5sYprKujSaP^$eGCj0HD&*RyPFz2zU!DkdlDc zO_ge6@MAmVp1Gg;V_yd!7jHioFHZmn%7{H6O?ow zY0{}Hyh{X?|XBbm8*e9 z*tY|(m#=ge9v!~E$y)j;O^R2K2sZHHxt$uVVwlBU)A;MV3v={=qIr76XJ;PQ-til`qm@8k^Uo!6*&>l{%4W4h zl-6HwR8%)`ieS~hz+M<92pjEvtdgy~kqW&h$l*UxI_sRc-7q8C*X$g)HFAdu z6NPyW*0<}BGs+LvvKn`^=C6fE+_(PQD1Q{Ormz+^e=@L~g)Yg@CuU`3t%+4Ek!Wsd zS!AmwTv+IOv=W*LdE+O^9#=05^zEb!^kxr7TO3-Mve|GFHw z0n{IvNSDEa$5sY~Z=oftq1Km^oah-s$BxSpRzL>uT1nBxaj>h*a1a42{F;ffoDoMJ zi~#UyWUIhof1xt0q!-Sz5(-HN>r8AQL4<~W$H^oQynC_joisz|#O57RL>|#b3&^1Qy7+^Kgw%xm?E~ogC{8AgFKt>V&PFq@Y79R4 z7$c(rS*uslDU>ovHNZ89AVrg0&PE>+|M%CCD9As*47 zlGPNPYXrAIf!dcAM9m{et_mSSBGLsv8fx>i<-choKHDf5@wcjkcSC}#0UH(+24|F( zMV%skGM7Hqe!uz1EWdGdbyZ!S`196opE~KL|4HcWd7-luRuqO9v*GR4w;RFqs)Qhzd;T@4u+RfYy)+=Yc-0WB=0cF~a7~1z3 zaDDLZiAFeJWkDGzVaa}nYp{vNSvF!;(Ns9BqO8S4G&kT0_&RemXa1A_hFRUI43mZ- zoHmVo0GsP54Aqd^2@lM5_3&%RUN9a@zvUy9JkYaI>e+i#d*1MNC+*_#crako=0^Bw zANZ`LuW96Hs_VS!zpmd6zTi6yVOEB5-X&?~LbB+4)w}X#reSg*E z2oDV5$qd9Ct)lg)jgJ(;&akqkYw&G}3I#)CWo5+)d⩽rRN}#}3why&bjd`-5=w z9;UZCOa$FqB|7g%w0pikNI`K;7y#U-D#!ru(*qZv`S@5i0+)h5zULJHJXC%+xT?TE ze~&1eC*!iwu7#i)OI34KKF~}V{ol6s4)Lab!%7keHZDiG4amy++?auQd#~JKU_&eq zYo~5%nzsE}G%!hi!)ljJ!ae9qU?n}Ffo-aZeuzQ0DS}&b@^$^r<>c*H;dP~sv+e8i zil)8G!{M|P3V1q5sFv#4A_ z0Q!c?K1;dg?TlR&Sus6DJO0dB@;nx_DYs*ZoEV?eYEo18tg^)iZ63OK^`7X&kd!y`r@$G-`dc5W z+{RuC+*iMu^n?!K=H~W(n@k4g^=gF5cIyM%WKA*rnW>zB)UmdDy=IpRI|-JR-0^^b<1K>F1$R5No3d6*|1od%tWmUSe(MAx%5R^Euq4X%6R9z26mRg;{nqSM8XR<2lI%xduaU9t zC*~N-G386{XUiE~Ky-ay9@me$M`qbxCW{z&c3#0r=am|*gD^+5i-MGaBLGb1MI&dUt*Eh<( zHo=>~$PJ4e>m80><6&SKWy(%F4W=t^>JB{pz!vl!PPRPGtW4#TnZ@#cL+^R|h^-Ic z)Ol86r*OU^oEn!#<)*{UgISL>p@8*AdYtpDWc9}gsCg&~8-7UVU@1EtRiaK(;aeGd zd!o&JbNUtGfi9Byw!!yBv!0Kc_q0cKZH@c|zkf%(HiSAb9*7IO1o977#K@?z638+V zgI4;PhPDY@P_!LC1^`Nar#Qs04ADmT+;*Qdzs{S(SjYY5T(o8y8e*0aaLq98V%<2S z%U<&0wcE^h)e3WsdZuYRIjhM}7ncMCLg2A7jP=7*QY6(B^BfV=Xa>Piz^j>{@URa!P!mXk>J;-)i*? zh#R0-&zIO>(@`@ck8$R=PVJQcbz?K+aoIoWzJE_7*Y`vl&R2g$zkfK6mb`phVAg%Y zOZ~DJ>8=J3E>N0zIce?fNT;7c>gy#z^Znzf9x8nd?!lcnq72BKbgvPZ?_^cE-4oXh zNui`D^czne^c;RX&%lFBvk~-Bjo>?gI>``WHLknw6is{_kgCpa%9I1Nj=K-Df3lK% z@~VCm|LhWdUx0~mug8(n5b>|CZcmy${^79gpvx@Qi_l3GG^XqdSo1(5^1Gi?0MVD* zF}E6ca*lH27zMfukDNwRY&}pBx zvUsH?Zk+m76Hd}JQ$+aW-5F{A{w;8j@d`t?IX&p^faVHnwmFqO{{?+qim$hKP>ful zfB+O4<6Ejv=~K9yH=PP^eC#kQi$V9Izv2wEfIw!rJV*~~Wnp(|n=`u-23CDfYJ|~) z|DnIEoB&jd`ndw|zb6M_1>j%hXiX5GJXEW=4JXdI7PGeS{%j~77`tJVN}0(5hjz|H zdJ-X6;Ncyt{V*dm+1gmrZ?KEo+*|kTm?xWICDDJLhd#DqPdLXJJUFr|&mQn7fuPOzRJB!dAyx6n>8zNj$GyEnfsN%HS0ikU+A#6B^$w%@qbX^KdQ~kZd~*3pKvgLO0G!AQPZ7P~}QCs_+3h}3xW8rW|{lZNi z5QlVSoejuCPKS(|WWYM00FaB6uBmr>ZT~U{x_J)0A6lYLi8K!Y`KcO|=J!rGyT%qV{RDhgB z96L{EsTHfZtiQe=NZ=KMmXio(+ow8W;5;QCalE9mSJNSUrKjFG8s=RxM8EBJH#}S8 z1lZkn+tEoISenJm<*gdY-bPQLQBG03RHL^q++@bGY}k%MXqI`S5{WdA7gOrOf6C$3Bf*ArZ4yv4HwWO#q2I5Huhpt-yQ!le zJKeBUw$9#ZH2a;M8sXFF$AbF64%{E^LFisqkCWY0x_CAzPWs|klP7kt$9a{`QCB$= zYJ;EHu=OX+)cFIl9!V<`281TgH3v3JBunBD*AXo_hiB55vR2F#3Pf^+;5L2ab*?# zG`C=u4i1zBx6o1H8l4p5D+z?8;A~i0a!7xHa~8jFHbn+dO})mg9eOogQZ-P1>VO$# z5KPjjv((Qr0=Z%LE6P;5Q?Of6H|Yg#!CY%;ZzLJj``)iGE!yq;nw$1)%)Jz=dFT4U zpxMclo}`CHE*zGWH05w1=B6Y2j`suNm+oO*TvBKh#MXcDW#5Z-1D<|QdEC}8GJ%<( zzXpFWwW7yaJg2NIxQy@WM^HjGnpPh61aM0;wgw ziJgrAB@$2I8KUs1{e`X2^7rrGAC-}*y44K-xzYFU((~&gIxDQ?aM1sRFDq&Muw(-m zJ6_C(-cf2A-GL0vrOhU)@2K9>UH(OJ(-r5EP=AG}X-*HZHifH%bAQqOIGwYV!xGW? zF+sp%=8BkgjEoc$twbS3!`4C#U$X-fQgHs;PdB$p-N)fpt1LODfvSxIO1`<5Y*r){ zbsI)7C&8BPo(G{$pg{ZgsNCi^_>i)5&r)Q5N@6GVbgd5|ok&jTHuKs0&1Pq&G2Wtq zR$w|ul4QAyZHDY{koyX-qgP3r-6H&`sj1KIut9?Q69zyxo>gB1u-VT8sX>-P8QR>E z)VA>T|0DYU$JO`#pP#8w&$(k-*Z`0S)ZQ^YDMqoPNFB3^q*xNkE{gWIMybE7y#M&V zoaNaVwT7b(&GuOIhg%opS!+^CRmow=82z!DYf7@#PM)jnw=Qlg0HQ1?W~GCbH&|(2 zL4Fy*7E*ZF^6<;YmV&p9PmKVCO5g*)N=Bg=KAVVLyT&H!-W+@PeNj;+fa*ESK}Zij zue-lp5r#--SEOf4w7jqyo=+y+P3FkDGe&)60}U7U#rE*hxe#;80L_!H?zF;o%)Hb$ zn!LZTTEjBX0<1fvGZ)><)nUu@!d5mU&5f7tY6WtCzv%tlv$!Y`Ygm|zohsiTtomcE z0oJoFkJ$=g8Tx`R_MOeXRSO*TG|5-!-Xxr@K`Mv@+L)y7_^}`So&R=On}VAB1uM~l zS=aiIfdEU#{feI0>jlT0i<710PdX*Pxlsq;m%O(n5|@$XZ99!{r-{mu-oc7lhwSQO zkXzBr4B$vP2YO-^1-dc0P=4>8_5O(_iwlGA1VR0<5_MRnEX^;lR6B3`XX@|CBQ&yG z;aC#HORi^r5kWUGx15JS6wlU#DIH2Au_de<$pCd@<|_&YFlyi~{G(`IffKgnd(S<> zuT5qbuwNu5jNel!TXbUdL&7WZ!#uf$Kb0g7Va=tN(X9V@dyXhc!1S2NozT1Xy1R1q zgKQmIND_1U5I6n37_)A{XA#lXCkRWzb;EE3K0zA6KNKWM$M%vca-4(aFyYegUm(a? zPYCo*nVeRBV9Za3(FO06ZqH*+AB@<3za;zpD3R@?A9_R{MSBeL%=3|$Qewi--BFjQ zfD4vkTVJL-)5nWiUU5D39E-fd+1n<$#y`oeBaYcts-7H6!WH|I-2F{;3*dji{=gg4o1Fh;u0g_5{vXFcL8K=@!A-$v9Ef6pRT_XJ!Vd54LB~jhyRq7zGA9n z3=+bf8i%Pj>yjr<8@3M_hcLEM1YMdD#}pjlA`Y65VUO!)f{CvypR$hg9*$Ik5`|bu zsf;$_cx;fFHzKGUcd+u{-B=+O_VTg!Kocpd{Pcl_5X-u8RvL1kNni`1Z`n9{Sn{dK z@`66#A;H&ycW;e4CO`n~*7~xXyZi#;(;#Tcl-)ZonDGVKd{ap_e6(9)>yb2}E`RO_ zQ}!TVRnMSdFCLUL9}A%TFP^;Mv(!NrKxp#*nz;dn@l97$p}Eds?Lm^MvXi8jU_r8NUXUxv3-TmXZ8_=SltEL9n}rQ224^;za#d$CDf? zz;&?L>+{8g&wWBad+t~FL!PM4JH`m8>flGx^o-doU(8cAj*k^tm>OM@!DWIoE8$;vx z1)CiHL#y7iX{iXQ3yFrqw=c57sy605F59RXSbDGR5*thtOUXir z^`$2k?hGSZTv#ZDMeuR{|LO7n6K?+>1-xXeimYrIS&=UeNP8~6<5!*2bPI|=OZ}08 zD{6V7xEPa|BZ@2FRfjTR>_E8k$xkI1nGLRua83sJV(*ITLvyTEUZy7+$wYj}ea+ft z_@*E*CCes$8nqn{38dx{%WmrG9hzlqp6GvjAfryHiWiZ$`MtmkSLBq>)|UdLP5@Fd z4TF|fWdJI!C-4izJZ&cc+Wb@D!`wH&RXWNen|H^jUvkr^JS*Y(^Z`YuXkf@16ekex zpO@nY{0v)BQ3V^%_UT_NvpuVW2eZEO3bU7oeMmulg9`qyh6)7=nO=d~^^-|T-7VzW z<(7cC$%HZJ7L@X|eI=v)`P$4@6X4PV51nS0PnX9B0A>mxNdDfaKr#rx$_S^KU>!PG?er-zCLm zu@ffRKs8r3lAn(#E?>=?{bC9MFv0@d0;*P1#Ito&zp8y5Va~R~9WtX>PGvY|goXw> zwV`&`-OUZA{%^Hz3cW+al3EEbZ2otdUW~NFe|eHWb}~ZQ0!A(LFWi;2*}+)iwm2tQ zdHtUluPd~sKomg|3B2``@8}U16XBY!;EO*56uiSEi0!AQ%67$srQEjIIS`4c{LTn} z{pk3jN{E=gV&wv|vEwr?%b1CFOSl)|1tbjaTlF;%ZC+m2Lw&r0D#l z)4Ak+j9Jdc!>VPROT=-Yt)3X+4rf#QEB^XDC7P2ZQ=Gx5{jKf?BOEln3!on}??#8L z%ZCfWPwy^>ZWF6=ohTXhIIC2_0Xn5{NQx7u^b;#(H$)Va22o{r!F?ZJyaA%?f?nLC z+i4_xD=fKCX#H9Y)G3X-%P3Ae9%XmX@mUCWOWxaJ9h&Xr(|JI2$O0lPp<|@Tq44N1 ziuMBXgHoEOBtg}D`^52PYM3d08?@gWoEXp~pMiQGgo#E}$XiBFMe7U5 zA<06($%a1=u#%!9YWH(*WGi8%<>+EkTDz(VUVqrQb?UrhFpflhL3VQudE|orSmLb< zhzWjouzkmDb8t+Pvo&-cWbp-L2xV&ncQuNh{@wlK#n9Gpj{u4$+HjL>#u(~`g|ime zr48tB2wtG?MbNHLH5;6mi-@R!OR*UE+`cyRtg2A1IrW^Z?mW`Br5{U4~>tUmO?K0fo9Aw`{$rAFU`Xp{NYEM?eFwQT%Y}bfK|do^QRV08I)If zg`vlGxtHZO$X;p$OcGvi!*_4{-SKdmV!9dRDr#lGO4{mia-hk;y9}-(iD`;fK_=oS zb_cF_(=955YRL0qv=;bNRFjchG7kAWhR+z9A2PEmH$*ws`hHW;r!XXaN`BEwc&qsY7h`+nk?;b+$Fi z72q?ToIh-g-3P<)vfGNg5)irnCmjF3L3l7tpxB<5AYBs>#T=syzOc)x_fF(UeS64Q zcx}}e+MFcCNwO$CMk#XrzbD2U%&#W5$wVuVD1U#LF0#KXx5QtGb33G1>1$)o_UM{& zw72Sv>&~>`LYDLPU4vd_BcsOY?8kdLh&OVtjnHSm_nZTiXxbako`oL`G8ZR5T#Pc( z<lV0}ebcQ7@@W?}&|Vrde#?jc(* zP-A%9DJZ-;NCkQtN#n-kYvUOJ_C;muQz^>rzfewQA-PRS{14iNw(M^){EwP4{hrsI z{GcmJ-jN-Yghc2IOOX!r$oNF4(dp4d>4SR=M5tH(V(HI^t zObh-t4AjyDRsdDb{laYTnP6iHOJ2f4mE7mxaBc+GjRZ4P7>7#7VQAZxUq+vv#*}L| z>_mw5Z`@jrxQH4wt(_`=M48@`R#&gG<>h^9vd*zyq&Qpgqf?q~XAN=NlT}6!;RB~f9 zLDG!&=v@2~#(2RSvg=_bQwQcCEHA1)tti}I0~}LaH~zA#J3BK3)6g8f&Z(4aG>iiT zH0O#<9{xUrBzL~bKkJK(+6h?>FUNXMs6whKM|}aygCWWAYgBdWu`8Dyc}bs{LcHsY zd#ad1o)qG;3!2!Ks#%8epoRN?B~|#@$c8E$R}`>^v3pi&iz`8BL+5s;!vovI@Ufvo z7Z&A>GgkCrxaZ%KT543WI`_d4;SZJAq+gz*h+e*mhm|a@;sY?F4V6)~t9Y8ikry;u zALj9(G5OMPzwKl9^Q2S$1M`6WY{?oenjdAqlPo#n@U2@_A^ILak z5dw}6SB4gqDdlD7FuF2+)i6E(jFI+1xXNC#z1=FE$viAi;I?Rckk5^9+ivm{B>QmT=#qzC9YJRvdC|-s4dnyFrp@rjm=?6Xr(<-N0uKf7;bp|ynJ_CG{xl0M`ERa z&Y^y_80R%e*HL{H@l1-Ykr_jUG-*294q^F#GngaJ+b3{cPY_iL%VuoXd-daU5UpmT zw#@JnZ~Hp73Dw*~Du{y)g)icBvW z>{pQ@8GRV_OC@J8F4S^M%{VuPuVO*>V92nCzo7;+HvX0ABIH-vt{4AcBX5C8v2dKZ z7;f$w&x!6n#OYB$y^-TEuCI?m;MooQ%9f6>;58;RhbQUMB8eQue(sXS`+B9=V}#J@ za<6gu_Q&_>St^&NKf2Ba0(H^7GV+p#X8wRMyxt<@N#vCxl8=)jm$sDkTPH@Fgm_Dw zuWRP0!e*%iM%AX%2LJ9{gV!^I-WjiTMQQQ2N>L%-8=ExA;&D!}oxws=w>fTX91FkvN zcO(Bg-{q9{!CZaJKX8_a6dCyvIAXZ77XkB#pbuzP8o6#VB^hu-7%(SUe{dzpJKuFW z9*zeI_5KKQ5+|N`A0Q|rFLe)27s5e~ju*!l)GwwX9_Q}r+0sdxH;F@F&zNTR`@)ll z%QVARe$cW8yYuu{_ZQs#m?&I-LIy6F@mwgITa!t`-p1&SH&klJH#rETD8W02^HWJ6 zyZ%U?uQ;=P<-v}ci_d%g5is~|5>F(#20V!fLJSyf|Gy>5dd@|R)=rBYf{PS-cEr;!4?hi0D={Qg6g{T?>Ga^>#P)ROaq=j=)qcX174^M)5J zvy8{1v4*RQ(VTBY!tT}dgU zafk+5F^b z|7dQ!mcAL8| zoKZ{h>zJ%-&oMfHz;ZF>h}kzbS8jUMS?z*F?oaPu6FVZ;HOSRY3X)6v!~W8jSa&&` z8ylAe9RjCfPhM>1%M;#O_VpAhGO&JPVQ8r`PgBQ?E#r4}qiUm2YSar1)s%k1lE2Mt zBACo_%1Vzdr=3yVnk?O}Z5WAwaAPxMVW@~`{I0g;FW>y{Fr`O(zWD~q7_f_k#=dF- z3T8PClwB>0(q$e@-o;%_QajA21AzqE31MS%;hY#DOiZcwUlB^G_TzLEt1mqxquwVm zq(*ykMv76)zsyYBFjJjImVs|wLI}Dg|NNyp8yym5dhZ)Bu_+u8J8B0u2>eNpV zmynRxWE)E0QQTXo!l!KUq=BRXM7>E?BJf0r1w@|5Of5WITfEWWqqGi2#$zgKw9v?* zC6f5_XF&Pn)7=LX4^vB`cvmZ%5luOv?@}@LFOvq>09i%ibi!SNNyGrQGK?MK9rQ*& z$=>G#yPKAl<{J?J+pC*rJ3PpI)zP6T+U^?^7sgqomhGN6*s{pzsD^sDqBRJfBV$dE zUIFTt_#f0xjOQcYI(lqv-g0mnb*6_aKx5u@P3bg$_`p1l_YW*Y%ezZA(DwE9vH!F% zF6|nT07Dy0zV`ffN4@x7iOHk6P|=8kJdQ_BPLvJ~YByLUG`H4|2D_A5Stnn9iwDXe z#Kf=fNJ>T>%_BKdQc}ztLZq_7a5{>IV|UFfo)rBJkHAx2I_*16R>HI7U#RCcZwdQ) zzi-WW3AkpR2Xr|0_r-Oq;?0GlbGUwBkhpICJzTHo*I9DAiDQ1xc}*k|etLE$_Vi5p zsuFfGZ%4L2QG|Eoi8!&po1BJ!|9&|#@}j8J){mscj>bsokfHG$r}xdK!E#S|>ey?p z`q}GuB8yA;dey+agF#xHv@21Z65mx%Laj^00zu{gAb-DTL_;Nez!BSo(1 zmXp6J4X%Sdb15-0VS!u#TQIp}o$#g~qIuOJJQ`Hz@!9J9i{q__T+?U<$2EN=nuY zQEifCu1vcV^=@VJX7T6-ba*lQKo(<+47lK*b`X$|&`=1F$IX4bTy!_OH3E2Z8?S`x z;%?1LP=57M#_Q&_6fY~ATEC(dqPgHTHf7d@J5k?!z$1sg0|1y*X8NMHU3pj!DvUe( zYbw}4UVr;97CdysH&|FqB`=ebX!{!=0eipbjkJ~UOYN`4?%dJ430_d`udh4oEw!6k zD)To#BC@EW{H*1n|3<@%;H(L(%NWcdD|uPZnoXZ@Kf=TDSmcsz9v-^ZbSxA1$M)SH zqM6p_W?R4>Om zK%ovIrBweMI(y@pfM9N_`hm;>2x-?`(OkCjEAJ# ztLw-Jw+5Lqeg{(>#^MqAYw5%u=b&q#k_ z9@hGi{V=C|h5$qx4(K@WzBeMbd9o9xt|L!0p8R(M} z-0E2Y1Mom!iqasZ_C3g_xQui-r%C(yayjM;=)w3GTh%74difHRG@gFhiRI6tnG4yt z4K$ZM?ycVQHCI&zNFzDJfsvZyU5&jen)4&2uHGYuCw@f!Ni)iV$qIFdBTHxbUl%s01^ZmhP7R)c1bs`ni;F?~y2{cEl_=R+(7}YRY zBA&Kq<*WHipUM3=Rnaei6E{UjnyskiQ}USwxeNq5z>`8o8i`WB`6lS0VQHPUpk?GH8wX7U7kc5(O@t~5>=ajKn zA{^i8o`xL-U942qPz1qFhjSn^8NAQF zPOmqNB@90+F_v#4ARauIiR(z&ZTHG?UuV;g^fM>G;m%*BTl}o=yHojNgcZg7xXgWj z5GT$g!`xyWm_|TjJI?zttkHK_;W%7Y=?f=kk_N3)j37l}kC?PHs_`=7mSwEZ@>-W^ z*B_vxvolfuRl|2qQqq}IB|gE+YgMQ7kcH>Aq;`&W4BhH<+63`<-bx-uXyfK)`|m?B zhK}oxTu-G73i!nCA9CEmzn))uJIJpzx<=3ThOW5cP)C!u{^pu&-OwfE{03y=b<_AC z06a(N4dLi|Z!)D|VP&;Zaf+?-4Cnnw(Nz};3sYqUABdZw;&4tL2p41p?oGRU zLIa1!QHH&kmMH-Ab+EW4`fBSM`tH|WT~XJrzY}ocV<2xs-&CM{!G2GlP+WDc0Agujg{^ z_8}2@c>6f{?(X~ro4%2egOld@6P1Li_fnF~PPbAl5(yRQVhPe)UhhMFu1yGegs+pm zMhki1c$+A;IQlf9#sTIasRHSQ+I;jyMs)P}OO_vBp$lI>s%K*r##~kC&OWer9^jPT zH*R?SD8W7@Ri*28q>D^cU)W)PzVorF9f1J&;6o;T$OAFbIK#n8zzTpNh3ZG4mo}a#v1`B;>WAF4gA?B+#$T;CGx_y?YyicUui%X zUOV+E^IFBWm=IDY_;#`F76E4=Y&2P=`geTK+QKeDnGT|a#Ywu?*7AsRh)F87^9rwK wy5#-)NX@?xdG#PhLE46FNsSpyX0(ZfM^D|JDKMXc(#&tJ+2WUybC+ApigX literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 383abb503be..bee9ba9f7a1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1229,6 +1229,7 @@ #include "code\modules\mob\living\simple_animal\parrot.dm" #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" +#include "code\modules\mob\living\simple_animal\bot_swarm\swarmer.dm" #include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" From 6ab24432557827994a7b59151f752ce758d32ab7 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Tue, 25 Aug 2015 13:46:05 -0400 Subject: [PATCH 7/8] Adds oxandrolone, a new burn medication designed to work upon ingestion. Adds oxandrolone to burn kits. Adds changelog. --- .../objects/items/weapons/storage/firstaid.dm | 4 +-- .../Chemistry-Reagents/Medicine-Reagents.dm | 25 ++++++++++++++++++- .../reagents/Chemistry-Recipes/Medicine.dm | 6 +++++ .../reagents/reagent_containers/pill.dm | 6 +++++ .../reagents/reagent_containers/syringes.dm | 5 ---- .../bgobandit - salicyclicassblastusa.yml | 7 ++++++ 6 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 html/changelogs/bgobandit - salicyclicassblastusa.yml diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 1b285543b59..65e2b67e0b3 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -45,8 +45,8 @@ new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/weapon/reagent_containers/syringe/silver_sulf(src) - new /obj/item/weapon/reagent_containers/syringe/silver_sulf(src) + new /obj/item/weapon/reagent_containers/pill/oxandrolone(src) + new /obj/item/weapon/reagent_containers/pill/oxandrolone(src) new /obj/item/weapon/reagent_containers/hypospray/medipen(src) new /obj/item/device/healthanalyzer(src) return diff --git a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm index 80aea6a6168..39496a45272 100644 --- a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm @@ -173,7 +173,7 @@ if(method == INGEST) M.adjustToxLoss(0.5*volume) if(show_message) - M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" + M << "You probably shouldn't have eaten that. Maybe you should have splashed it on, or applied a patch?" ..() return @@ -182,6 +182,29 @@ ..() return +/datum/reagent/medicine/oxandrolone + name = "Oxandrolone" + id = "oxandrolone" + description = "Stimulates healing of severe burns. If you have more than 50 burn damage, it heals 2 units; otherwise, 0.5. If overdosed it will exacerbate existing burns, causing burn and brute damage." + reagent_state = LIQUID + color = "#f7ffa5" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 25 + +/datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/M) + if(M.getFireLoss() > 50) + M.adjustFireLoss(-2*REM) + else + M.adjustFireLoss(-0.5*REM) + ..() + return + +/datum/reagent/medicine/oxandrolone/overdose_process(mob/living/M) + M.adjustFireLoss(2.5*REM) // it's going to be healing either 2 or 0.5 + M.adjustBruteLoss(0.5*REM) + ..() + return + /datum/reagent/medicine/styptic_powder name = "Styptic Powder" id = "styptic_powder" diff --git a/code/modules/reagents/Chemistry-Recipes/Medicine.dm b/code/modules/reagents/Chemistry-Recipes/Medicine.dm index 357eac96a5e..72e00ded6a1 100644 --- a/code/modules/reagents/Chemistry-Recipes/Medicine.dm +++ b/code/modules/reagents/Chemistry-Recipes/Medicine.dm @@ -102,6 +102,12 @@ required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1) result_amount = 5 +/datum/chemical_reaction/oxandrolone + name = "Oxandrolone" + id = "oxandrolone" + result = "oxandrolone" + required_reagents = list("carbon" = 3, "phenol" = 1, "hydrogen" = 1, "oxygen" = 1) + result_amount = 6 /datum/chemical_reaction/salbutamol name = "Salbutamol" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 2a99e768c75..94ece6ee2c0 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -133,6 +133,12 @@ icon_state = "pill5" list_reagents = list("sal_acid" = 24) roundstart = 1 +/obj/item/weapon/reagent_containers/pill/oxandrolone + name = "oxandrolone pill" + desc = "Used to stimulate burn healing." + icon_state = "pill5" + list_reagents = list("oxandrolone" = 24) + roundstart = 1 /obj/item/weapon/reagent_containers/pill/insulin name = "insulin pill" diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 6f5e5bb1c7a..46b77827093 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -216,11 +216,6 @@ desc = "Contains charcoal." list_reagents = list("charcoal" = 15) -/obj/item/weapon/reagent_containers/syringe/silver_sulf - name = "syringe (silver sulfadiazine)" - desc = "Contains silver sulfadiazine." - list_reagents = list("silver_sulfadiazine" = 15) - /obj/item/weapon/reagent_containers/syringe/antiviral name = "syringe (spaceacillin)" desc = "Contains antiviral agents." diff --git a/html/changelogs/bgobandit - salicyclicassblastusa.yml b/html/changelogs/bgobandit - salicyclicassblastusa.yml new file mode 100644 index 00000000000..8f54843614a --- /dev/null +++ b/html/changelogs/bgobandit - salicyclicassblastusa.yml @@ -0,0 +1,7 @@ +author: bgobandit + +delete-after: True + +changes: + - bugfix: "Overheard at CentComm: 'This burn kit said salicyclic acid would heal my burns! WHO MADE THIS SHIT?' A muffled honking is heard in the background. (Burn first-aid kits now contain an appropriate burn pill.)" + - rscadd: "Oxandrolone, a new burn healing medication, has been added to burn first-aid kits and to chemistry. Ingesting 25 units or more causes burn and brute damage." \ No newline at end of file From 22ffbca5a297f397ca8f65e57c2ddf97b74a354d Mon Sep 17 00:00:00 2001 From: sybil-tgstation13 Date: Fri, 28 Aug 2015 05:43:08 +0000 Subject: [PATCH 8/8] Automatic changelog compile --- html/changelog.html | 7 +++++++ html/changelogs/.all_changelog.yml | 7 +++++++ html/changelogs/bgobandit - salicyclicassblastusa.yml | 7 ------- 3 files changed, 14 insertions(+), 7 deletions(-) delete mode 100644 html/changelogs/bgobandit - salicyclicassblastusa.yml diff --git a/html/changelog.html b/html/changelog.html index 74b09bfbaa3..821377b3ad1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,13 @@ -->
+

28 August 2015

+

bgobandit updated:

+
    +
  • Overheard at CentComm: 'This burn kit said salicyclic acid would heal my burns! WHO MADE THIS SHIT?' A muffled honking is heard in the background. (Burn first-aid kits now contain an appropriate burn pill.)
  • +
  • Oxandrolone, a new burn healing medication, has been added to burn first-aid kits and to chemistry. Ingesting 25 units or more causes burn and brute damage.
  • +
+

19 August 2015

Joan updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index eac761cfbc9..b84356a720c 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1646,3 +1646,10 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscdel: Splashing someone with chemicals no longer injects those chemicals in their body. - bugfix: Fixes splashing acid on items or floor with items not having any effect. +2015-08-28: + bgobandit: + - bugfix: 'Overheard at CentComm: ''This burn kit said salicyclic acid would heal + my burns! WHO MADE THIS SHIT?'' A muffled honking is heard in the background. + (Burn first-aid kits now contain an appropriate burn pill.)' + - rscadd: Oxandrolone, a new burn healing medication, has been added to burn first-aid + kits and to chemistry. Ingesting 25 units or more causes burn and brute damage. diff --git a/html/changelogs/bgobandit - salicyclicassblastusa.yml b/html/changelogs/bgobandit - salicyclicassblastusa.yml deleted file mode 100644 index 8f54843614a..00000000000 --- a/html/changelogs/bgobandit - salicyclicassblastusa.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: bgobandit - -delete-after: True - -changes: - - bugfix: "Overheard at CentComm: 'This burn kit said salicyclic acid would heal my burns! WHO MADE THIS SHIT?' A muffled honking is heard in the background. (Burn first-aid kits now contain an appropriate burn pill.)" - - rscadd: "Oxandrolone, a new burn healing medication, has been added to burn first-aid kits and to chemistry. Ingesting 25 units or more causes burn and brute damage." \ No newline at end of file