From 49653babab4eb68b6ecb4fb2be79b7e61a5effd5 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 8 Feb 2019 04:28:07 -0800 Subject: [PATCH 001/142] Update snacks_meat.dm --- code/modules/food_and_drinks/food/snacks_meat.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index c77242e69d..33a5ca56dc 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -184,6 +184,14 @@ tastes = list("the jungle" = 1, "bananas" = 1) foodtype = MEAT | SUGAR +/obj/item/reagent_containers/food/snacks/monkeycube/On_Consume(mob/M) + if(iscarbon(M)) + M.visible_message("[src] bursts out of [M]!") + M.say("*scream") + M.Knockdown(40) + M.adjustBruteLoss(60) + Expand() + /obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand() var/mob/spammer = get_mob_by_key(fingerprintslast) var/mob/living/carbon/monkey/bananas = new(drop_location(), TRUE, spammer) From a56793d6c0f466e11c6d382e72cf2b413a2f08a5 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 8 Feb 2019 05:27:51 -0800 Subject: [PATCH 002/142] Update snacks_meat.dm --- code/modules/food_and_drinks/food/snacks_meat.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index 33a5ca56dc..b7add0ee0e 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -184,13 +184,14 @@ tastes = list("the jungle" = 1, "bananas" = 1) foodtype = MEAT | SUGAR -/obj/item/reagent_containers/food/snacks/monkeycube/On_Consume(mob/M) +/obj/item/reagent_containers/food/snacks/monkeycube/On_Consume(mob/living/carbon/M) if(iscarbon(M)) M.visible_message("[src] bursts out of [M]!") M.say("*scream") M.Knockdown(40) M.adjustBruteLoss(60) Expand() + return ..() /obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand() var/mob/spammer = get_mob_by_key(fingerprintslast) From e80b17e5723c1228d63d41598eebd354e486277f Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Fri, 8 Mar 2019 20:55:41 -0500 Subject: [PATCH 003/142] Update code/modules/food_and_drinks/food/snacks_meat.dm Co-Authored-By: deathride58 --- code/modules/food_and_drinks/food/snacks_meat.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index b7add0ee0e..d3466caa5e 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -187,7 +187,7 @@ /obj/item/reagent_containers/food/snacks/monkeycube/On_Consume(mob/living/carbon/M) if(iscarbon(M)) M.visible_message("[src] bursts out of [M]!") - M.say("*scream") + M.emote("scream") M.Knockdown(40) M.adjustBruteLoss(60) Expand() From e4c5f005a0072fb356c6ac97f7893d7376a78d23 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Fri, 15 Mar 2019 16:26:17 -0400 Subject: [PATCH 004/142] makes DNR apply properly to ghost roles and midround antags --- code/__HELPERS/game.dm | 3 ++- code/modules/awaymissions/corpse.dm | 5 +++++ code/modules/client/verbs/suicide.dm | 10 ++++++---- code/modules/mob/dead/observer/observer.dm | 14 +++++++++++--- modular_citadel/code/game/machinery/cryopod.dm | 6 ++---- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 7d578337bc..ad29125d95 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -413,7 +413,8 @@ var/list/candidates = list() for(var/mob/dead/observer/G in GLOB.player_list) - candidates += G + if(G.can_reenter_round) + candidates += G return pollCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category, flashwindow, candidates) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 276c488bce..7274f73965 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -41,6 +41,11 @@ return if(QDELETED(src) || QDELETED(user)) return + if(isobserver(user)) + var/mob/dead/observer/O = user + if(!O.can_reenter_round) + to_chat(user, "You are unable to reenter the round.") + return var/ghost_role = alert(latejoinercalling ? "Latejoin as [mob_name]? (This is a ghost role, and as such, it's very likely to be off-station.)" : "Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No") if(ghost_role == "No" || !loc) return diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 64d58cd40b..2e643cc05d 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -198,11 +198,13 @@ death(0) -/mob/living/proc/suicide_log() - log_game("[key_name(src)] committed suicide at [AREACOORD(src)] as [src.type].") +/mob/living/proc/suicide_log(ghosting) + log_game("[key_name(src)] [ghosting ? "ghosted" : "committed suicide"] at [AREACOORD(src)] as [src.type].") + message_admins("[key_name(src)] [ghosting ? "ghosted" : "committed suicide"] at [AREACOORD(src)].") -/mob/living/carbon/human/suicide_log() - log_game("[key_name(src)] (job: [src.job ? "[src.job]" : "None"]) committed suicide at [AREACOORD(src)].") +/mob/living/carbon/human/suicide_log(ghosting) + log_game("[key_name(src)] (job: [src.job ? "[src.job]" : "None"]) [is_special_character(src) ? "(ANTAG!) " : ""][ghosting ? "ghosted" : "committed suicide"] at [AREACOORD(src)].") + message_admins("[key_name(src)] (job: [src.job ? "[src.job]" : "None"]) [is_special_character(src) ? "(ANTAG!) " : ""][ghosting ? "ghosted" : "committed suicide"] at [AREACOORD(src)].") /mob/living/proc/canSuicide() switch(stat) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 12fe984d6f..ad074e1f39 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -18,6 +18,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) invisibility = INVISIBILITY_OBSERVER hud_type = /datum/hud/ghost var/can_reenter_corpse + var/can_reenter_round = TRUE var/datum/hud/living/carbon/hud = null // hud var/bootime = 0 var/started_as_observer //This variable is set to 1 when you enter the game as an observer. @@ -266,6 +267,7 @@ Works together with spawning an observer, noted above. var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc. SStgui.on_transfer(src, ghost) // Transfer NanoUIs. ghost.can_reenter_corpse = can_reenter_corpse + ghost.can_reenter_round = (can_reenter_corpse && !suiciding) ghost.key = key return ghost @@ -280,7 +282,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp // CITADEL EDIT if(istype(loc, /obj/machinery/cryopod)) - var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you may not play again this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") + var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") if(response != "Ghost")//darn copypaste return var/obj/machinery/cryopod/C = loc @@ -293,20 +295,22 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(stat == DEAD) ghostize(1) else - var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you may not play again this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") + var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") if(response != "Ghost") return //didn't want to ghost after-all ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 + suicide_log(TRUE) /mob/camera/verb/ghost() set category = "OOC" set name = "Ghost" set desc = "Relinquish your life and enter the land of the dead." - var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you may not play again this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") + var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") if(response != "Ghost") return ghostize(0) + suicide_log(TRUE) /mob/dead/observer/Move(NewLoc, direct) if(updatedir) @@ -617,6 +621,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(src, "This isn't really a creature, now is it!") return 0 + if(!can_reenter_round) + to_chat(src, "You are unable to re-enter the round.") + return FALSE + if(can_reenter_corpse && mind && mind.current) if(alert(src, "Your soul is still tied to your former life as [mind.current.name], if you go forward there is no going back to that life. Are you sure you wish to continue?", "Move On", "Yes", "No") == "No") return 0 diff --git a/modular_citadel/code/game/machinery/cryopod.dm b/modular_citadel/code/game/machinery/cryopod.dm index 9369fa7677..1ff628bfbd 100644 --- a/modular_citadel/code/game/machinery/cryopod.dm +++ b/modular_citadel/code/game/machinery/cryopod.dm @@ -365,10 +365,8 @@ // Ghost and delete the mob. if(!mob_occupant.get_ghost(1)) - if(world.time < 30 * 600)//before the 30 minute mark - mob_occupant.ghostize(0) // Players despawned too early may not re-enter the game - else - mob_occupant.ghostize(1) + mob_occupant.ghostize(0) // Players who cryo out may not re-enter the round + QDEL_NULL(occupant) open_machine() name = initial(name) From 95c975078cfb4abf4e049a853930cc69f0409bd1 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Fri, 15 Mar 2019 19:22:28 -0400 Subject: [PATCH 005/142] fixes travis --- code/modules/mob/dead/observer/observer.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ad074e1f39..55b8891534 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -310,7 +310,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(response != "Ghost") return ghostize(0) - suicide_log(TRUE) /mob/dead/observer/Move(NewLoc, direct) if(updatedir) From 9d711370d41198381f05d52ee57679999cb5e6f9 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Fri, 15 Mar 2019 20:09:34 -0400 Subject: [PATCH 006/142] Fixes staminaloss not redirecting to the chest when attempting to apply to the head --- code/modules/mob/living/carbon/human/species.dm | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 0e5eef2ffb..e1935a9b5d 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1653,13 +1653,19 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/obj/item/bodypart/BP = null if(isbodypart(def_zone)) - BP = def_zone + if(damagetype == STAMINA && istype(def_zone, /obj/item/bodypart/head)) + BP = H.get_bodypart(check_zone(BODY_ZONE_CHEST)) + else + BP = def_zone else if(!def_zone) def_zone = ran_zone(def_zone) + if(damagetype == STAMINA && def_zone == BODY_ZONE_HEAD) + def_zone = BODY_ZONE_CHEST BP = H.get_bodypart(check_zone(def_zone)) - if(!BP) - BP = H.bodyparts[1] + + if(!BP) + BP = H.bodyparts[1] switch(damagetype) if(BRUTE) From dcea7886d8bf2a7452c80315dd6db18f720afb28 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Fri, 15 Mar 2019 20:25:44 -0400 Subject: [PATCH 007/142] Makes sprinting stamloss make sense by making sprinting take no stamloss in no gravity or when being pulled --- .../code/modules/mob/living/carbon/human/human_movement.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm index c4449d33d7..2a1c790b2a 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm @@ -4,7 +4,7 @@ /mob/living/carbon/human/Move(NewLoc, direct) var/oldpseudoheight = pseudo_z_axis . = ..() - if(. && sprinting && !(movement_type & FLYING) && canmove && !resting && m_intent == MOVE_INTENT_RUN) + if(. && sprinting && !(movement_type & FLYING) && canmove && !resting && m_intent == MOVE_INTENT_RUN && has_gravity(loc) && !pulledby) adjustStaminaLossBuffered(0.3) if((oldpseudoheight - pseudo_z_axis) >= 8) to_chat(src, "You trip off of the elevated surface!") From 9408fd8daf51c99f58167f7f5517203304283741 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sat, 16 Mar 2019 12:58:49 -0400 Subject: [PATCH 008/142] Update recipes_pizza.dm --- .../recipes/tablecraft/recipes_pizza.dm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm index 70f4b50727..528fa97342 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm @@ -101,3 +101,13 @@ ) result = /obj/item/reagent_containers/food/snacks/pizza/pineapple subcategory = CAT_PIZZA + +/datum/crafting_recipe/food/anomalypizzaboy + name = "Anomaly pizza box" + reqs = list( + /obj/item/pizzabox = 5, + /obj/item/assembly/signaler/anomaly = 1 + ) + tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + result = /obj/item/pizzabox/infinite + subcategory = CAT_PIZZA From f88de367ed28e9bfabedab5ea25868bf148be25d Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sat, 16 Mar 2019 13:26:45 -0400 Subject: [PATCH 009/142] Update recipes_pizza.dm --- .../food_and_drinks/recipes/tablecraft/recipes_pizza.dm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm index 528fa97342..64447dd180 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm @@ -102,6 +102,15 @@ result = /obj/item/reagent_containers/food/snacks/pizza/pineapple subcategory = CAT_PIZZA +/datum/crafting_recipe/food/pineapplepizza/anomaly + name = "Anomaly Hawaiian pizza" + reqs = list( + /obj/item/assembly/signaler/anomaly = 1, + /obj/item/reagent_containers/food/snacks/pizza/pineapple = 1 + ) + result = /obj/item/reagent_containers/food/snacks/pizza/pineapple/anomaly + subcategory = CAT_PIZZA + /datum/crafting_recipe/food/anomalypizzaboy name = "Anomaly pizza box" reqs = list( From 45a0fc856e370631676b099523fec5b75bca06b7 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sat, 16 Mar 2019 17:46:38 -0400 Subject: [PATCH 010/142] Update snacks_pizza.dm --- .../food_and_drinks/food/snacks_pizza.dm | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/code/modules/food_and_drinks/food/snacks_pizza.dm b/code/modules/food_and_drinks/food/snacks_pizza.dm index a6b026ac30..403636db08 100644 --- a/code/modules/food_and_drinks/food/snacks_pizza.dm +++ b/code/modules/food_and_drinks/food/snacks_pizza.dm @@ -149,16 +149,25 @@ icon_state = "pineapplepizza" slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/pineapple bonus_reagents = list("nutriment" = 6, "vitamin" = 6) - tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pineapple" = 2, "ham" = 2) - foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | FRUIT | PINEAPPLE + tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pineapple" = 6, "ham" = 2) + foodtype = PINEAPPLE //Over powering tast of gods fruit /obj/item/reagent_containers/food/snacks/pizzaslice/pineapple name = "\improper Hawaiian pizza slice" desc = "A slice of delicious controversy." icon_state = "pineapplepizzaslice" filling_color = "#FF4500" - tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pineapple" = 2, "ham" = 2) - foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | FRUIT | PINEAPPLE + tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pineapple" = 6, "ham" = 2) + foodtype = PINEAPPLE //Over powering tast of gods fruit + +/obj/item/reagent_containers/food/snacks/pizza/pineapple/anomaly + desc = "A anomaly made pizza with pineapple..." + bonus_reagents = list("nutriment" = 16, "vitamin" = 16) + tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pineapple" = 6, "ham" = 2, "good" = 10) + +/obj/item/reagent_containers/food/snacks/pizzaslice/pineapple/anomaly + desc = "A slice of good tasting pizza. But has pineapple on it, what a anomaly!" + tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pineapple" = 6, "ham" = 2, "good" = 10) /obj/item/reagent_containers/food/snacks/pizza/arnold name = "\improper Arnold pizza" From 4fea9d3a65d797b6f5668c172c281dffb6880ed0 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 16 Mar 2019 15:46:42 -0700 Subject: [PATCH 011/142] Update revolution.dm --- code/game/gamemodes/revolution/revolution.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 09047b05a9..86ce6db426 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -13,7 +13,7 @@ antag_flag = ROLE_REV false_report_weight = 10 restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") - required_players = 30 + required_players = 35 required_enemies = 2 recommended_enemies = 3 enemy_minimum_age = 14 From 696625f7b895840ef8c3bc2540d9696e42eaf59b Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 16 Mar 2019 15:47:19 -0700 Subject: [PATCH 012/142] Update clock_cult.dm --- code/game/gamemodes/clock_cult/clock_cult.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 06a365a82c..f3e4f75488 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -131,7 +131,7 @@ Credit where due: config_tag = "clockwork_cult" antag_flag = ROLE_SERVANT_OF_RATVAR false_report_weight = 10 - required_players = 20 + required_players = 30 required_enemies = 2 recommended_enemies = 4 enemy_minimum_age = 7 From 83dbfc29874c9401497930422f07089d6ed86fdf Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 16 Mar 2019 15:48:06 -0700 Subject: [PATCH 013/142] Update cult.dm --- code/game/gamemodes/cult/cult.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 782ad54e4c..7b492e3a95 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -37,9 +37,9 @@ false_report_weight = 10 restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel") protected_jobs = list() - required_players = 20 - required_enemies = 2 - recommended_enemies = 4 + required_players = 30 + required_enemies = 3 + recommended_enemies = 5 enemy_minimum_age = 7 announce_span = "cult" From 8b3d4c3da1eafdf3cb5b94546bd364091ffa22f3 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 16 Mar 2019 15:48:28 -0700 Subject: [PATCH 014/142] Update clock_cult.dm --- code/game/gamemodes/clock_cult/clock_cult.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index f3e4f75488..d6513b5d40 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -132,8 +132,8 @@ Credit where due: antag_flag = ROLE_SERVANT_OF_RATVAR false_report_weight = 10 required_players = 30 - required_enemies = 2 - recommended_enemies = 4 + required_enemies = 3 + recommended_enemies = 5 enemy_minimum_age = 7 protected_jobs = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain") //Silicons can eventually be converted restricted_jobs = list("Chaplain", "Captain") From 5e6e651869c557b39109697c8734383b695e0b21 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 16 Mar 2019 15:50:42 -0700 Subject: [PATCH 015/142] eh fuck it revs can stay --- code/game/gamemodes/revolution/revolution.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 86ce6db426..09047b05a9 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -13,7 +13,7 @@ antag_flag = ROLE_REV false_report_weight = 10 restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") - required_players = 35 + required_players = 30 required_enemies = 2 recommended_enemies = 3 enemy_minimum_age = 14 From abc0936256a616afc4c1ea4234e9fc5a6b7d6510 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sun, 17 Mar 2019 05:00:14 -0500 Subject: [PATCH 016/142] hide flavors --- code/modules/mob/living/carbon/human/examine.dm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 77cf6fc4bb..c6ba900b13 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -341,8 +341,13 @@ else if(isobserver(user) && traitstring) msg += "Traits: [traitstring]
" - if(print_flavor_text() && get_visible_name() != "Unknown")//Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation. - msg += "[print_flavor_text()]\n" + if(print_flavor_text()) + if(get_visible_name() == "Unknown") //Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation. + msg += "...?
" + else if(skipface) //Sometimes we're not unknown, but impersonating someone in a hardsuit, let's not reveal our flavor text then either. + msg += "...?
" + else + msg += "[print_flavor_text()]\n" msg += "*---------*" to_chat(user, msg) From 1791a8526e6a0ebb3a08e98e3788f8c3c7975fa1 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Mar 2019 17:31:13 -0500 Subject: [PATCH 017/142] donator beret --- modular_citadel/code/modules/client/loadout/__donator.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index 66245fbb8a..c0a4df2243 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -367,4 +367,10 @@ datum/gear/darksabresheath name = "Soul Necklace" category = SLOT_NECK path = /obj/item/clothing/neck/undertale - ckeywhitelist = list("twilightic") \ No newline at end of file + ckeywhitelist = list("twilightic") + +/datum/gear/frenchberet + name = "French Beret" + category = SLOT_HEAD + path = /obj/item/clothing/head/frenchberet + ckeywhitelist = list("notazoltan") \ No newline at end of file From ce473dad9c560f72dc2580205e2a3a9da5dec830 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sun, 17 Mar 2019 22:15:41 -0700 Subject: [PATCH 018/142] Update shuttle.dm --- modular_citadel/code/controllers/subsystem/shuttle.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/controllers/subsystem/shuttle.dm b/modular_citadel/code/controllers/subsystem/shuttle.dm index 4b9dd33d08..bb4592f819 100644 --- a/modular_citadel/code/controllers/subsystem/shuttle.dm +++ b/modular_citadel/code/controllers/subsystem/shuttle.dm @@ -1,5 +1,5 @@ /datum/controller/subsystem/shuttle/proc/autoEnd() //CIT CHANGE - allows shift to end after 3 hours has passed. - if(world.time > auto_call && EMERGENCY_IDLE_OR_RECALLED) //3 hours + if((world.realtime - SSshuttle.realtimeofstart) > auto_call && EMERGENCY_IDLE_OR_RECALLED) //3 hours SSshuttle.emergency.request() priority_announce("The shift has come to an end and the shuttle called.") log_game("Round time limit reached. Shuttle has been auto-called.") From 079264bf9302cb1ca7ea067db21a5f8fb441fea1 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sun, 17 Mar 2019 22:16:44 -0700 Subject: [PATCH 019/142] Update communications.dm --- code/game/machinery/computer/communications.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 3b87c923d7..43f5b96fbd 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -202,7 +202,7 @@ state = STATE_CANCELSHUTTLE if("cancelshuttle2") if(authenticated) - if(world.time > SSshuttle.auto_call) //Citadel Edit Removing auto_call caused recall. + if((world.realtime - SSshuttle.realtimeofstart) > SSshuttle.auto_call) //Citadel Edit Removing auto_call caused recall. say("Warning: Emergency shuttle recalls have been blocked by Central Command due to ongoing crew transfer procedures.") else SSshuttle.cancelEvac(usr) From 39397ea938f00c5e11e656d87df52c30756c8a93 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sun, 17 Mar 2019 22:17:30 -0700 Subject: [PATCH 020/142] Update shuttle.dm --- code/controllers/subsystem/shuttle.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index e2e7c3d327..78cceddc8b 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -54,6 +54,7 @@ SUBSYSTEM_DEF(shuttle) var/lockdown = FALSE //disallow transit after nuke goes off var/auto_call = 72000 //CIT CHANGE - time before in deciseconds in which the shuttle is auto called. Default is 2ish hours plus 15 for the shuttle. So total is 3. + var/realtimeofstart = 0 /datum/controller/subsystem/shuttle/Initialize(timeofday) ordernum = rand(1, 9000) @@ -74,6 +75,7 @@ SUBSYSTEM_DEF(shuttle) WARNING("No /obj/docking_port/mobile/emergency/backup placed on the map!") if(!supply) WARNING("No /obj/docking_port/mobile/supply placed on the map!") + realtimeofstart = world.realtime return ..() /datum/controller/subsystem/shuttle/proc/initial_load() From 461d42ae6b28165e9fd0d7240a6384b6c6a2f02c Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sun, 17 Mar 2019 22:18:13 -0700 Subject: [PATCH 021/142] Update ticker.dm --- code/controllers/subsystem/ticker.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index d54f6fc3ef..acfb2babc3 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -304,6 +304,7 @@ SUBSYSTEM_DEF(ticker) to_chat(world, "

[holiday.greet()]

") PostSetup() + SSshuttle.realtimeofstart = world.realtime return TRUE From ea37b1a17292dcceab411bad41fc507b4f574e3a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 18 Mar 2019 00:30:38 -0500 Subject: [PATCH 022/142] Automatic changelog generation for PR #8122 [ci skip] --- html/changelogs/AutoChangeLog-pr-8122.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8122.yml diff --git a/html/changelogs/AutoChangeLog-pr-8122.yml b/html/changelogs/AutoChangeLog-pr-8122.yml new file mode 100644 index 0000000000..2b9d091601 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8122.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - bugfix: "Staminaloss targeted at the head now properly redirects to the chest." From 25d079c4b8ce3dd0baa71c7b4d3cbd556d062856 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Mon, 18 Mar 2019 03:19:18 -0500 Subject: [PATCH 023/142] Fixes blood overlay and shield issues for taurs --- code/modules/clothing/spacesuits/hardsuit.dm | 5 ++++- code/modules/clothing/suits/_suits.dm | 7 +++++-- modular_citadel/icons/mob/64x32_effects.dmi | Bin 0 -> 35318 bytes 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 modular_citadel/icons/mob/64x32_effects.dmi diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 974936ba30..44916aa6af 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -712,7 +712,10 @@ /obj/item/clothing/suit/space/hardsuit/shielded/worn_overlays(isinhands) . = list() if(!isinhands) - . += mutable_appearance('icons/effects/effects.dmi', shield_state, MOB_LAYER + 0.01) + if(tauric == TRUE) + . += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', shield_state, MOB_LAYER + 0.01) + else + . += mutable_appearance('icons/effects/effects.dmi', shield_state, MOB_LAYER + 0.01) /obj/item/clothing/head/helmet/space/hardsuit/shielded resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index ad0311f160..93c15743e8 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -36,7 +36,7 @@ if(tauric == TRUE) center = TRUE dimension_x = 64 - else if(H.dna.features["taur"] in list("Fox", "Wolf", "Otie", "Drake", "Lab", "Shepherd", "Husky", "Eevee", "Panther", "Tajaran", "Horse", "Cow")) + else if(H.dna.features["taur"] in list("Fox","Wolf","Otie","Drake","Lab","Shepherd","Husky","Eevee","Panther","Horse","Cow","Tiger")) taurmode = PAW_TAURIC if(tauric == TRUE) center = TRUE @@ -61,7 +61,10 @@ if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]") IF_HAS_BLOOD_DNA(src) - . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood") + if(tauric == TRUE) + . += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "[blood_overlay_type]blood") + else + . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood") var/mob/living/carbon/human/M = loc if(ishuman(M) && M.w_uniform) var/obj/item/clothing/under/U = M.w_uniform diff --git a/modular_citadel/icons/mob/64x32_effects.dmi b/modular_citadel/icons/mob/64x32_effects.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7db65a8fc31d1f3d43419a64d2b83e0cf455d423 GIT binary patch literal 35318 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

Q8&^ugcfy3TsWU?uPINTsbvsDn$^ywt>p~Z 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

_w5 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 P_)kSyL#b53DDeLPiMwb5 literal 0 HcmV?d00001 From ff28797d946be696ef5e08a9b7754ef5413c985c Mon Sep 17 00:00:00 2001 From: Poojawa Date: Mon, 18 Mar 2019 04:39:47 -0500 Subject: [PATCH 024/142] Initial belly interactions return + wet sound check --- .../code/modules/vore/eating/belly_obj_vr.dm | 101 ++++++++++-------- .../code/modules/vore/eating/living_vr.dm | 22 ++-- .../code/modules/vore/eating/vore_vr.dm | 2 +- .../code/modules/vore/eating/vorepanel_vr.dm | 7 ++ 4 files changed, 74 insertions(+), 58 deletions(-) diff --git a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm index 1aa8122be5..e76a09d4b7 100644 --- a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm +++ b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm @@ -26,18 +26,19 @@ var/escapetime = 20 SECONDS // Deciseconds, how long to escape this belly var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles var/absorbchance = 0 // % Chance of stomach beginning to absorb if prey struggles - var/escapechance = 100 // % Chance of prey beginning to escape if prey struggles. + var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles. var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone. var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine. // var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to. var/silent = FALSE - var/transferlocation = null // Location that the prey is released if they struggle and get dropped off. + var/transferlocation // Location that the prey is released if they struggle and get dropped off. var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location var/autotransferwait = 10 // Time between trying to transfer. var/swallow_time = 10 SECONDS // for mob transfering automation var/vore_capacity = 1 // simple animal nom capacity + var/is_wet = TRUE // Is this belly inside slimy parts? //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere. var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY,DM_ABSORB,DM_UNABSORB) // Possible digest modes @@ -138,7 +139,8 @@ "digest_messages_owner", "digest_messages_prey", "examine_messages", - "emote_lists" + "emote_lists", + "is_wet" ) //ommitted list @@ -167,7 +169,7 @@ to_chat(owner,"[thing] slides into your [lowertext(name)].") //Sound w/ antispam flag setting - if(!silent && !recent_sound) + if(is_wet && !recent_sound) for(var/mob/M in get_hearers_in_view(5, get_turf(owner))) if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES)) playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) @@ -268,8 +270,10 @@ prey.forceMove(src) var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE) - if(!silent) + + if(is_wet) prey.playsound_local(loc,preyloop,70,0, channel = CHANNEL_PREYLOOP) + owner.updateVRPanel() for(var/mob/living/M in contents) @@ -461,6 +465,9 @@ //Yes, it's ""safe"" to drop items here /obj/belly/AllowDrop() return TRUE +/* +/obj/belly/onDropInto(var/atom/movable/AM) + return null */ //Handle a mob struggling // Called from /mob/living/carbon/relaymove() @@ -469,6 +476,23 @@ return // User is not in this belly R.setClickCooldown(50) + + if(owner.stat) //If owner is stat (dead, KO) we can actually escape + to_chat(R,"You attempt to climb out of \the [lowertext(name)]. (This will take around [escapetime/10] seconds.)") + to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!") + + if(do_after(R, owner, escapetime)) + if((owner.stat || escapable) && (R.loc == src)) //Can still escape? + release_specific_contents(R) + return + else if(R.loc != src) //Aren't even in the belly. Quietly fail. + return + else //Belly became inescapable or mob revived + to_chat(R,"Your attempt to escape [lowertext(name)] has failed!") + to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!") + return + return + var/struggle_outer_message = pick(struggle_messages_outside) var/struggle_user_message = pick(struggle_messages_inside) @@ -483,41 +507,33 @@ struggle_outer_message = "" + struggle_outer_message + "" struggle_user_message = "" + struggle_user_message + "" - if((owner.stat || !owner.client) && (R.a_intent != INTENT_HELP)) //If owner is stat (dead, KO) we can actually escape - to_chat(R,"You attempt to climb out of \the [lowertext(name)]. (This will take around 5 seconds.)") - to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!") - - if(!do_mob(R,owner,50)) - return - if(!(R in contents)) //Aren't even in the belly. Quietly fail. - return - if(R.a_intent != INTENT_HELP) //still want to? - release_specific_contents(R) - return - else //Belly became inescapable or mob revived - to_chat(R,"Your attempt to escape [lowertext(name)] has failed!") - to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!") - return - else if(R.a_intent != INTENT_HELP) //failsafe to make sure people are able to struggle out. friendly ERP should be on help intent. - to_chat(R,"You attempt to climb out of [lowertext(name)]. (This will take around [escapetime] seconds.)") - to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!") - if(!do_mob(R,owner,escapetime)) - return - release_specific_contents(R) - return - else if (R.a_intent == INTENT_HELP) - for(var/mob/M in get_hearers_in_view(3, get_turf(owner))) - M.show_message(struggle_outer_message, 1) // visible - to_chat(R,struggle_user_message) - - if(!silent) - for(var/mob/M in get_hearers_in_view(5, get_turf(owner))) + if(is_wet) + for(var/mob/M in get_hearers_in_view(2, get_turf(owner))) if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES)) playsound(get_turf(owner),"struggle_sound",35,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED) R.stop_sound_channel(CHANNEL_PRED) var/sound/prey_struggle = sound(get_sfx("prey_struggle")) R.playsound_local(get_turf(R),prey_struggle,45,0) + for(var/mob/M in get_hearers_in_view(3, get_turf(owner))) + if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES)) //Might as well censor the normies here too. + M.show_message(struggle_outer_message, 1) // visible + to_chat(R,struggle_user_message) + + if(escapable) //If the stomach has escapable enabled. + if(prob(escapechance)) //Let's have it check to see if the prey escapes first. + to_chat(R,"You start to climb out of \the [lowertext(name)].") + to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!") + if(do_after(R, escapetime)) + if((owner.stat || escapable) && (R.loc == src)) //Can still escape? + release_specific_contents(R) + return + else if(R.loc != src) //Aren't even in the belly. Quietly fail. + return + else //Belly became inescapable or mob revived + to_chat(R,"Your attempt to escape [lowertext(name)] has failed!") + to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!") + return else if(prob(transferchance) && transferlocation) //Next, let's have it see if they end up getting into an even bigger mess then when they started. var/obj/belly/dest_belly for(var/belly in owner.vore_organs) @@ -525,6 +541,7 @@ if(B.name == transferlocation) dest_belly = B break + if(!dest_belly) to_chat(owner, "Something went wrong with your belly transfer settings. Your [lowertext(name)] has had it's transfer chance and transfer location cleared as a precaution.") transferchance = 0 @@ -541,21 +558,10 @@ to_chat(owner,"You feel your [lowertext(name)] start to cling onto its contents...") digest_mode = DM_ABSORB return -/* - else if(prob(digestchance) && digest_mode != DM_ITEMWEAK && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance. + + else if(prob(digestchance) && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance. to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get more active...") to_chat(owner,"You feel your [lowertext(name)] beginning to become active!") - digest_mode = DM_ITEMWEAK - return - - else if(prob(digestchance) && digest_mode == DM_ITEMWEAK) //Oh god it gets even worse if you fail twice! - to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get even more active!") - to_chat(owner,"You feel your [lowertext(name)] beginning to become even more active!") - digest_mode = DM_DIGEST - return */ - else if(prob(digestchance)) //Finally, let's see if it should run the digest chance.) - to_chat(R, "In response to your struggling, \the [name] begins to get more active...") - to_chat(owner, "You feel your [name] beginning to become active!") digest_mode = DM_DIGEST return @@ -609,6 +615,7 @@ dupe.autotransferwait = autotransferwait dupe.swallow_time = swallow_time dupe.vore_capacity = vore_capacity + dupe.is_wet = is_wet //// Object-holding variables //struggle_messages_outside - strings diff --git a/modular_citadel/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm index 2e6018f112..74ae0bfe35 100644 --- a/modular_citadel/code/modules/vore/eating/living_vr.dm +++ b/modular_citadel/code/modules/vore/eating/living_vr.dm @@ -1,15 +1,16 @@ ///////////////////// Mob Living ///////////////////// /mob/living var/digestable = FALSE // Can the mob be digested inside a belly? - var/obj/belly/vore_selected // Default to no vore capability. - var/list/vore_organs = list() // List of vore containers inside a mob + var/showvoreprefs = TRUE // Determines if the mechanical vore preferences button will be displayed on the mob or not. + var/obj/belly/vore_selected // Default to no vore capability. + var/list/vore_organs = list() // List of vore containers inside a mob var/devourable = FALSE // Can the mob be vored at all? -// var/feeding = FALSE // Are we going to feed someone else? - var/vore_taste = null // What the character tastes like +// var/feeding = FALSE // Are we going to feed someone else? + var/vore_taste = null // What the character tastes like var/no_vore = FALSE // If the character/mob can vore. - var/openpanel = 0 // Is the vore panel open? - var/noisy = FALSE // tummies are rumbly? - var/absorbed = FALSE //are we absorbed? + var/openpanel = 0 // Is the vore panel open? + var/noisy = FALSE // tummies are rumbly? + var/absorbed = FALSE //are we absorbed? var/next_preyloop // @@ -26,7 +27,8 @@ //Tries to load prefs if a client is present otherwise gives freebie stomach spawn(10 SECONDS) // long delay because the server delays in its startup. just on the safe side. - M.init_vore() + if(M) + M.init_vore() //Return 1 to hook-caller return 1 @@ -281,7 +283,7 @@ */ // -// Custom resist catches for /mob/living +// Our custom resist catches for /mob/living // /mob/living/proc/vore_process_resist() @@ -293,7 +295,7 @@ //Other overridden resists go here - return FALSE + return 0 // internal slimy button in case the loop stops playing but the player wants to hear it /mob/living/proc/preyloop_refresh() diff --git a/modular_citadel/code/modules/vore/eating/vore_vr.dm b/modular_citadel/code/modules/vore/eating/vore_vr.dm index 16366bbb14..32d19fc11b 100644 --- a/modular_citadel/code/modules/vore/eating/vore_vr.dm +++ b/modular_citadel/code/modules/vore/eating/vore_vr.dm @@ -28,7 +28,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE // The datum type bolted onto normal preferences datums for storing Vore stuff // -#define VORE_VERSION 2 +#define VORE_VERSION 3 GLOBAL_LIST_EMPTY(vore_preferences_datums) diff --git a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm index 30209b6da2..bc30de6ca6 100644 --- a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm +++ b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm @@ -156,6 +156,10 @@ dat += "Name:" dat += " '[selected.name]'" + //Belly Type button + dat += "Has Flesh Noises?" + dat += "[selected.is_wet ? "Yes" : "No"]" + //Digest Mode Button dat += "
Belly Mode:" dat += " [selected.digest_mode]" @@ -457,6 +461,9 @@ selected.name = new_name + if(href_list["b_wetness"]) + selected.is_wet = !selected.is_wet + if(href_list["b_mode"]) var/list/menu_list = selected.digest_modes From 286662be52ff992f6e5bcb162461cbd716136ca9 Mon Sep 17 00:00:00 2001 From: Ragolution Date: Mon, 18 Mar 2019 08:52:35 -0400 Subject: [PATCH 025/142] Adds new round-end sound. Bye, have a beautiful time. https://www.youtube.com/watch?v=cepZIk0PlvM --- sound/roundend/haveabeautifultime.ogg | Bin 0 -> 90973 bytes tgstation.dme | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 sound/roundend/haveabeautifultime.ogg diff --git a/sound/roundend/haveabeautifultime.ogg b/sound/roundend/haveabeautifultime.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0d5a5ed336d78602b2062994db1d010f0211ceaa GIT binary patch literal 90973 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 r0000$qweeP>Vl&H?9 Date: Mon, 18 Mar 2019 08:54:04 -0400 Subject: [PATCH 026/142] Enables new sound. Why the fuck is this in the ticker subsystem? --- code/controllers/subsystem/ticker.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index d54f6fc3ef..35a92d7c19 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -655,7 +655,8 @@ SUBSYSTEM_DEF(ticker) 'sound/roundend/its_only_game.ogg', 'sound/roundend/yeehaw.ogg', 'sound/roundend/disappointed.ogg', - 'sound/roundend/gondolabridge.ogg'\ + 'sound/roundend/gondolabridge.ogg', + 'sound/roundend/haveabeautifultime.ogg'\ ) SEND_SOUND(world, sound(round_end_sound)) From 62d39d2b7b0586546c86f3c20585432c8b75ac4e Mon Sep 17 00:00:00 2001 From: Ragolution Date: Mon, 18 Mar 2019 08:59:07 -0400 Subject: [PATCH 027/142] no runtimestation ung --- tgstation.dme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tgstation.dme b/tgstation.dme index 823de6caf2..c43b1a7019 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -13,7 +13,7 @@ // END_PREFERENCES // BEGIN_INCLUDE -#include "_maps\runtimestation.dm" +#include "_maps\_basemap.dm" #include "code\_compile_options.dm" #include "code\world.dm" #include "code\__DEFINES\_globals.dm" From 9cb42656756daed90e77d584a674be96d2463307 Mon Sep 17 00:00:00 2001 From: Ragolution Date: Mon, 18 Mar 2019 16:22:18 -0400 Subject: [PATCH 028/142] Improves operation console stuff Changes confusing wording on Optable console --- code/modules/surgery/advanced/revival.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm index 085253e4c9..55d048db21 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/advanced/revival.dm @@ -26,7 +26,7 @@ return TRUE /datum/surgery_step/revive - name = "repair body" + name = "electric stimulation" implements = list(/obj/item/twohanded/shockpaddles = 100, /obj/item/melee/baton = 75, /obj/item/gun/energy = 60) time = 120 From 026bf39929ccacd9c1cc500daee64c04e66de16b Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Mon, 18 Mar 2019 17:31:03 -0400 Subject: [PATCH 029/142] NYA~ --- code/game/objects/items/devices/PDA/PDA_types.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index 089286efda..81faa081eb 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -185,6 +185,12 @@ desc = "A portable microcomputer by Thinktronic Systems, LTD. This model is a special edition with a transparent case." note = "Congratulations, you have chosen the Thinktronic 5230 Personal Data Assistant Deluxe Special Max Turbo Limited Edition!" +/obj/item/pda/neko + name = "neko PDA" + icon_state = "pda-neko" + desc = "A portable microcomputer by Thinktronic Systems, LTD. This model is a special edition a feline fine case." + note = "Congratulations, you have chosen the Thinktronic 5230 Personal Data Assistant Deluxe Special Mew Turbo Limited Edition NYA~!" + /obj/item/pda/cook name = "cook PDA" icon_state = "pda-cook" From b1205baa76029623ae0cdbf44739b0ab26124d34 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Mon, 18 Mar 2019 17:41:12 -0400 Subject: [PATCH 030/142] Update mrow_thats_right.dmm --- _maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm | 1 + 1 file changed, 1 insertion(+) diff --git a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm index 00ba365abf..0baac3252a 100644 --- a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm +++ b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm @@ -350,6 +350,7 @@ dir = 4 }, /obj/structure/closet/cabinet, +/obj/item/pda/neko, /obj/item/gps{ gpstag = "kitty" }, From 830bfff1801ebbbf6613136ff4ade71f8a6f14e1 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Mon, 18 Mar 2019 17:45:26 -0400 Subject: [PATCH 031/142] Update PDA_types.dm --- code/game/objects/items/devices/PDA/PDA_types.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index 81faa081eb..80d8cb5963 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -114,7 +114,7 @@ /obj/item/pda/heads/rd name = "research director PDA" default_cartridge = /obj/item/cartridge/rd - inserted_item = /obj/item/pen/fountain + inserted_item = /obj/item/pen/fourcolor icon_state = "pda-rd" /obj/item/pda/captain From a7b7d7492a4f1e6c3296e59edbb9960329fbac69 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Mon, 18 Mar 2019 18:52:38 -0400 Subject: [PATCH 032/142] Add files via upload --- modular_citadel/icons/obj/food/drink.dmi | Bin 0 -> 423 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 modular_citadel/icons/obj/food/drink.dmi diff --git a/modular_citadel/icons/obj/food/drink.dmi b/modular_citadel/icons/obj/food/drink.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0972025b4f4272db44645bb3e7ff4881bc678164 GIT binary patch literal 423 zcmV;Y0a*TtP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5sUR~iJ2x{YTZxM^C9|j)C}haRnO2mTn+jp0C@e`$#HCJI!PU;eD Date: Mon, 18 Mar 2019 19:45:51 -0400 Subject: [PATCH 033/142] Update drinks_recipes.dm --- .../food_and_drinks/recipes/drinks_recipes.dm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 02106e808c..f41f6cce80 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -692,3 +692,15 @@ id = "pwr_game" results = list("pwr_game" = 5) required_reagents = list("sodawater" = 1, "blackcrayonpowder" = 1, "sodiumchloride" = 1) + +/datum/chemical_reaction/pinkmilk + name = "Strawberry Milk" + id = "pinkmilk" + results = list("pinkmilk" = 5) + required_reagents = list("aphro+" = 1, "milk" = 1) + +/datum/chemical_reaction/pinktea + name = "Strawberry Tea" + id = "pinktea" + results = list("pinktea" = 5) + required_reagents = list("aphro" = 1, "arnold_palmer" = 1, "sugar" = 1) From c321e443198107592f64aa7a9981683ca9973e83 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Mon, 18 Mar 2019 20:20:24 -0400 Subject: [PATCH 034/142] Update drink_reagents.dm --- .../chemistry/reagents/drink_reagents.dm | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 0cbd1f2d85..3a0709ead6 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -745,3 +745,35 @@ taste_description = "sweet pomegranates" glass_name = "glass of grenadine" glass_desc = "Delicious flavored syrup." + +/datum/reagent/consumable/pinkmilk + name = "Strawberry Milk" + id = "pinkmilk" + description = "A drink of a bygone era of milk and artificial sweetener back on a rock." + color = "#f76aeb"//rgb(247, 106, 235) + quality = DRINK_FANTASTIC //Love drink + taste_description = "sweet strawberry and milk cream" + glass_name = "tall glass of strawberry milk" + glass_desc = "Delicious flavored strawberry syrup mixed with milk." + +/datum/reagent/consumable/tea/pinkmilk/on_mob_life(mob/living/carbon/M) + if(prob(15)) + to_chat(M, "[pick("You cant help to smile.","You feel nostalgia all of sudden.","You remember to relax.")]") + ..() + . = 1 + +/datum/reagent/consumable/pinktea //Tiny Tim song + name = "Strawberry Tea" + id = "pinktea" + description = "A timeless classic!" + color = "#f76aeb"//rgb(247, 106, 235) + quality = DRINK_FANTASTIC //Love drink + taste_description = "sweet tea with a hint of strawberry" + glass_name = "mug of strawberry tea" + glass_desc = "Delicious traditional tea flavored with strawberries." + +/datum/reagent/consumable/tea/pinktea/on_mob_life(mob/living/carbon/M) + if(prob(10)) + to_chat(M, "[pick("Diamond skies where white deer fly.","Sipping strawberry tea.","Silver raindrops drift through timeless, Neverending June.","Crystal ... pearls free, with love!","Beaming love into me.")]") + ..() + . = 1 From 4699d8380181194535113725c1a3a2b52d7d1e81 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Mon, 18 Mar 2019 20:24:57 -0400 Subject: [PATCH 035/142] the icons damn it! --- code/modules/reagents/chemistry/reagents/drink_reagents.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 3a0709ead6..6ec37f3ec4 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -751,6 +751,7 @@ id = "pinkmilk" description = "A drink of a bygone era of milk and artificial sweetener back on a rock." color = "#f76aeb"//rgb(247, 106, 235) + glass_icon_state = "pinkmilk" quality = DRINK_FANTASTIC //Love drink taste_description = "sweet strawberry and milk cream" glass_name = "tall glass of strawberry milk" @@ -767,6 +768,7 @@ id = "pinktea" description = "A timeless classic!" color = "#f76aeb"//rgb(247, 106, 235) + glass_icon_state = "pinktea" quality = DRINK_FANTASTIC //Love drink taste_description = "sweet tea with a hint of strawberry" glass_name = "mug of strawberry tea" From 8f782da23ec3e318ccc102f52261f2743b57ffac Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 18 Mar 2019 21:59:42 -0400 Subject: [PATCH 036/142] attempts to resolve serverside lag with high playercounts by adding a sanity check to mouse movements --- code/_onclick/drag_drop.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index cc13e262a8..e5c0ffc1ab 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -111,7 +111,7 @@ if(mob && LAZYLEN(mob.mousemove_intercept_objects)) for(var/datum/D in mob.mousemove_intercept_objects) D.onMouseMove(object, location, control, params) - if(mob) //CIT CHANGE - passes onmousemove() to mobs + if(!show_popup_menus && mob) //CIT CHANGE - passes onmousemove() to mobs mob.onMouseMove(object, location, control, params) //CIT CHANGE - ditto ..() From 09f77d0438c4c93c660fb3a1db1784d75afbe5f1 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 18 Mar 2019 23:02:07 -0400 Subject: [PATCH 037/142] Nerfs dinks - Ballistic projectiles are now the only projectiles that can emit a dink --- code/modules/projectiles/projectile.dm | 3 ++- code/modules/projectiles/projectile/bullets.dm | 1 + code/modules/projectiles/projectile/bullets/special.dm | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 1391e9ce42..efae090707 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -18,6 +18,7 @@ var/def_zone = "" //Aiming at var/atom/movable/firer = null//Who shot it var/suppressed = FALSE //Attack message + var/candink = FALSE //Can this projectile play the dink sound when hitting the head? var/yo = null var/xo = null var/atom/original = null // the original target clicked @@ -185,7 +186,7 @@ playsound(loc, hitsound, volume, 1, -1) L.visible_message("[L] is hit by \a [src][organ_hit_text]!", \ "[L] is hit by \a [src][organ_hit_text]!", null, COMBAT_MESSAGE_RANGE) - if(def_zone == BODY_ZONE_HEAD) + if(candink && def_zone == BODY_ZONE_HEAD) playsound(src, 'sound/weapons/dink.ogg', 30, 1) L.on_hit(src) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 725ef9baa6..7daeca91ea 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -4,6 +4,7 @@ damage = 60 damage_type = BRUTE nodamage = FALSE + candink = TRUE flag = "bullet" hitsound_wall = "ricochet" impact_effect_type = /obj/effect/temp_visual/impact_effect diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm index 091dff454c..38a570c75f 100644 --- a/code/modules/projectiles/projectile/bullets/special.dm +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -5,6 +5,7 @@ knockdown = 60 forcedodge = TRUE nodamage = TRUE + candink = FALSE hitsound = 'sound/items/bikehorn.ogg' icon = 'icons/obj/hydroponics/harvest.dmi' icon_state = "banana" From 357d90433f83c063ea48739ec0bea900786f1fbb Mon Sep 17 00:00:00 2001 From: deathride58 Date: Tue, 19 Mar 2019 19:43:36 -0400 Subject: [PATCH 038/142] Makes panic bunker interactions be logged in IRC --- code/modules/admin/verbs/panicbunker.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/modules/admin/verbs/panicbunker.dm b/code/modules/admin/verbs/panicbunker.dm index ab3aeb4ba5..2897427d6f 100644 --- a/code/modules/admin/verbs/panicbunker.dm +++ b/code/modules/admin/verbs/panicbunker.dm @@ -13,6 +13,7 @@ if (new_pb && !SSdbcore.Connect()) message_admins("The Database is not connected! Panic bunker will not work until the connection is reestablished.") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Panic Bunker", "[new_pb ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + send2irc("Panic Bunker", "[key_name(usr)] has toggled the Panic Bunker, it is now [new_pb ? "enabled" : "disabled"].") /client/proc/addbunkerbypass(ckeytobypass as text) set category = "Special Verbs" @@ -24,7 +25,8 @@ GLOB.bunker_passthrough |= ckey(ckeytobypass) log_admin("[key_name(usr)] has added [ckeytobypass] to the current round's bunker bypass list.") - message_admins("[key_name(usr)] has added [ckeytobypass] to the current round's bunker bypass list.") + message_admins("[key_name_admin(usr)] has added [ckeytobypass] to the current round's bunker bypass list.") + send2irc("Panic Bunker", "[key_name(usr)] has added [ckeytobypass] to the current round's bunker bypass list.") /client/proc/revokebunkerbypass(ckeytobypass as text) set category = "Special Verbs" @@ -36,5 +38,5 @@ GLOB.bunker_passthrough -= ckey(ckeytobypass) log_admin("[key_name(usr)] has removed [ckeytobypass] from the current round's bunker bypass list.") - message_admins("[key_name(usr)] has removed [ckeytobypass] from the current round's bunker bypass list.") - + message_admins("[key_name_admin(usr)] has removed [ckeytobypass] from the current round's bunker bypass list.") + send2irc("Panic Bunker", "[key_name(usr)] has removed [ckeytobypass] from the current round's bunker bypass list.") From 4761d9d7f362d396a990a9da4f1f16dc6d19eea7 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Tue, 19 Mar 2019 20:18:15 -0400 Subject: [PATCH 039/142] Makes OOC and LOOC actually use different toggles --- code/__HELPERS/_cit_helpers.dm | 34 ------------------------------- code/_globalvars/configuration.dm | 1 + code/modules/admin/admin.dm | 11 +++++++++- code/modules/admin/admin_verbs.dm | 1 + code/modules/client/verbs/looc.dm | 7 ++----- code/modules/client/verbs/ooc.dm | 10 +++++++++ 6 files changed, 24 insertions(+), 40 deletions(-) diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index b6c968b163..eb2a564d1b 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -90,10 +90,6 @@ GLOBAL_LIST_INIT(dildo_colors, list(//mostly neon colors "Purple" = "#e300ff"//purple )) -//Looc stuff -GLOBAL_VAR_INIT(looc_allowed, 1) -GLOBAL_VAR_INIT(dlooc_allowed, 1) - //Crew objective and miscreants stuff GLOBAL_VAR_INIT(miscreants_allowed, FALSE) @@ -124,36 +120,6 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE) src << "You will [(prefs.chat_toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel." SSblackbox.record_feedback("tally", "admin_verb", 1, "TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/admins/proc/togglelooc() - set category = "Server" - set desc="Fukken metagamers" - set name="Toggle LOOC" - toggle_looc() - log_admin("[key_name(usr)] toggled LOOC.") - message_admins("[key_name_admin(usr)] toggled LOOC.") - SSblackbox.record_feedback("tally", "admin_verb", 1, "TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/proc/toggle_looc(toggle = null) - if(toggle != null) //if we're specifically en/disabling ooc - if(toggle != GLOB.looc_allowed) - GLOB.looc_allowed = toggle - else - return - else //otherwise just toggle it - GLOB.looc_allowed = !GLOB.looc_allowed - world << "The LOOC channel has been globally [GLOB.looc_allowed ? "enabled" : "disabled"]." - -/datum/admins/proc/toggleloocdead() - set category = "Server" - set desc="Toggle dis bitch" - set name="Toggle Dead LOOC" - GLOB.dlooc_allowed = !( GLOB.dlooc_allowed ) - - log_admin("[key_name(usr)] toggled Dead LOOC.") - message_admins("[key_name_admin(usr)] toggled Dead LOOC.") - SSblackbox.record_feedback("tally", "admin_verb", 1, "TDLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - /mob/living/carbon/proc/has_penis() if(getorganslot("penis"))//slot shared with ovipositor if(istype(getorganslot("penis"), /obj/item/organ/genital/penis)) diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index fe83828e05..2334ce6bca 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -9,6 +9,7 @@ GLOBAL_VAR_INIT(changelog_hash, "") GLOBAL_VAR_INIT(hub_visibility, FALSE) GLOBAL_VAR_INIT(ooc_allowed, TRUE) // used with admin verbs to disable ooc - not a config option apparently +GLOBAL_VAR_INIT(looc_allowed, TRUE) GLOBAL_VAR_INIT(dooc_allowed, TRUE) GLOBAL_VAR_INIT(aooc_allowed, FALSE) GLOBAL_VAR_INIT(enter_allowed, TRUE) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 1a398f56fc..b400f44b98 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -538,13 +538,22 @@ message_admins("[key_name_admin(usr)] toggled OOC.") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle OOC", "[GLOB.ooc_allowed ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/admins/proc/toggleooclocal() + set category = "Server" + set desc="Toggle dat bitch" + set name="Toggle Local OOC" + toggle_looc() + log_admin("[key_name(usr)] toggled LOOC.") + message_admins("[key_name_admin(usr)] toggled LOOC.") + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Local OOC", "[GLOB.ooc_allowed ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /datum/admins/proc/toggleoocdead() set category = "Server" set desc="Toggle dis bitch" set name="Toggle Dead OOC" toggle_dooc() - log_admin("[key_name(usr)] toggled OOC.") + log_admin("[key_name(usr)] toggled Dead OOC.") message_admins("[key_name_admin(usr)] toggled Dead OOC.") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Dead OOC", "[GLOB.dooc_allowed ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index e21c2b8873..ac1ae51f69 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -24,6 +24,7 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin()) /client/proc/game_panel, /*game panel, allows to change game-mode etc*/ /client/proc/check_ai_laws, /*shows AI and borg laws*/ /datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/ + /datum/admins/proc/toggleooclocal, /*toggles looc on/off for everyone*/ /datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/ /datum/admins/proc/toggleaooc, /*toggles antag ooc on/off*/ /datum/admins/proc/toggleenter, /*toggles whether people can join the current game*/ diff --git a/code/modules/client/verbs/looc.dm b/code/modules/client/verbs/looc.dm index ccfcdae405..4049034203 100644 --- a/code/modules/client/verbs/looc.dm +++ b/code/modules/client/verbs/looc.dm @@ -24,11 +24,8 @@ return if(!holder) - if(!GLOB.ooc_allowed) - to_chat(src, " OOC is globally muted") - return - if(!GLOB.dooc_allowed && (mob.stat == DEAD)) - to_chat(usr, " OOC for dead mobs has been turned off.") + if(!GLOB.looc_allowed) + to_chat(src, " LOOC is globally muted") return if(prefs.muted & MUTE_OOC) to_chat(src, " You cannot use OOC (muted).") diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 1d54b9f4a0..5df13a1ffe 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -80,6 +80,16 @@ GLOB.ooc_allowed = !GLOB.ooc_allowed to_chat(world, "The OOC channel has been globally [GLOB.ooc_allowed ? "enabled" : "disabled"].") +/proc/toggle_looc(toggle = null) + if(toggle != null) + if(toggle != GLOB.looc_allowed) + GLOB.looc_allowed = toggle + else + return + else + GLOB.looc_allowed = !GLOB.looc_allowed + + /proc/toggle_dooc(toggle = null) if(toggle != null) if(toggle != GLOB.dooc_allowed) From 81ba8ff40b33d07ceba1596e2253f715a5266c67 Mon Sep 17 00:00:00 2001 From: Ragolution Date: Tue, 19 Mar 2019 23:55:37 -0400 Subject: [PATCH 040/142] Update vent_clog.dm Works locally, like this. Fuck if I know. --- code/modules/events/vent_clog.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 3945a12a40..02d7596678 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -118,6 +118,9 @@ foam.start() CHECK_TICK +/datum/round_event/vent_clog/male/announce() + priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert") + /datum/round_event/vent_clog/male/start() for(var/obj/machinery/atmospherics/components/unary/vent in vents) if(vent && vent.loc) @@ -130,6 +133,9 @@ foam.start() CHECK_TICK +/datum/round_event/vent_clog/female/announce() + priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert") + /datum/round_event/vent_clog/female/start() for(var/obj/machinery/atmospherics/components/unary/vent in vents) if(vent && vent.loc) From 0b459ad06ffe1bef25c8ada7e24323004a3c42fc Mon Sep 17 00:00:00 2001 From: Ragolution Date: Wed, 20 Mar 2019 00:35:42 -0400 Subject: [PATCH 041/142] Fixes 200,000 runtimes during scrubber event thanks kevinz thanks kevinz thanks kevinz thanks kevinz thanks kevinz thanks kevinz thanks kevinz thanks kevinz thanks kevinz thanks kevinz thanks kevinz thanks kevinz thanks kevinz --- .../code/modules/reagents/reagents/cit_reagents.dm | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm index e5d2b49b37..1390417a5c 100644 --- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm +++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm @@ -37,10 +37,17 @@ ..() dir = pick(1,2,4,8) -/datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume) +/* /datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume) if(!isspaceturf(T)) var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/semen(T) - reagentdecal.reagents.add_reagent("semen", reac_volume) + reagentdecal.reagents.add_reagent("semen", reac_volume) */ + +/datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume) + if(!isspaceturf(T)) + var/obj/effect/decal/cleanable/semen/S = locate() in T.contents + if(!S) + S = new/obj/effect/decal/cleanable/semen(T) + S.reagents.add_reagent("semen", reac_volume) /datum/reagent/consumable/femcum name = "Female Ejaculate" From f7807ceb737618fd38e61ba3ac9e3fcbc58fbe02 Mon Sep 17 00:00:00 2001 From: Ragolution Date: Wed, 20 Mar 2019 01:14:43 -0400 Subject: [PATCH 042/142] Hmm... --- .../code/modules/reagents/reagents/cit_reagents.dm | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm index 1390417a5c..30bf43bfea 100644 --- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm +++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm @@ -40,14 +40,8 @@ /* /datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume) if(!isspaceturf(T)) var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/semen(T) - reagentdecal.reagents.add_reagent("semen", reac_volume) */ - -/datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume) - if(!isspaceturf(T)) - var/obj/effect/decal/cleanable/semen/S = locate() in T.contents - if(!S) - S = new/obj/effect/decal/cleanable/semen(T) - S.reagents.add_reagent("semen", reac_volume) + reagentdecal.reagents.add_reagent("semen", reac_volume) +*/ /datum/reagent/consumable/femcum name = "Female Ejaculate" From 793a8c5c44ad1b2aeccde91219ff1c05cf8bfef9 Mon Sep 17 00:00:00 2001 From: Ragolution Date: Wed, 20 Mar 2019 01:42:18 -0400 Subject: [PATCH 043/142] QoL naming changes It's MY CODE NOW, TRILBY. YOU CAN'ST STOPP ME --- code/modules/events/vent_clog.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 02d7596678..f84fe2edb0 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -75,7 +75,7 @@ reagentsAmount = 250 /datum/round_event_control/vent_clog/beer - name = "Foamy beer stationwide" + name = "Clogged Vents: Beer" typepath = /datum/round_event/vent_clog/beer max_occurrences = 0 @@ -83,12 +83,12 @@ reagentsAmount = 100 /datum/round_event_control/vent_clog/plasma_decon - name = "Plasma decontamination" + name = "Anti-Plasma Flood" typepath = /datum/round_event/vent_clog/plasma_decon max_occurrences = 0 /datum/round_event_control/vent_clog/female - name = "FemCum stationwide" + name = "Clogged Vents; Girlcum" typepath = /datum/round_event/vent_clog/female max_occurrences = 0 @@ -96,7 +96,7 @@ reagentsAmount = 100 /datum/round_event_control/vent_clog/male - name = "Semen stationwide" + name = "Clogged Vents: Semen" typepath = /datum/round_event/vent_clog/male max_occurrences = 0 From ef58b35603d7314164b1ae5d36e6fffbfbcb7e03 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Wed, 20 Mar 2019 15:57:14 -0400 Subject: [PATCH 044/142] Update human_defense.dm --- code/modules/mob/living/carbon/human/human_defense.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index ce906565d2..b66ebdb001 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -4,7 +4,9 @@ if(def_zone) if(isbodypart(def_zone)) - return checkarmor(def_zone, type) + var/obj/item/bodypart/bp = def_zone + if(bp.body_part) + return checkarmor(def_zone, type) var/obj/item/bodypart/affecting = get_bodypart(ran_zone(def_zone)) return checkarmor(affecting, type) //If a specific bodypart is targetted, check how that bodypart is protected and return the value. From 6667a89a0a40402fb88c1198b5fa9cd436d0c366 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Wed, 20 Mar 2019 16:02:07 -0400 Subject: [PATCH 045/142] Update mob_helpers.dm --- code/modules/mob/mob_helpers.dm | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index fa908db729..ee9a589a5c 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -30,30 +30,13 @@ /proc/ran_zone(zone, probability = 80) - zone = check_zone(zone) - if(prob(probability)) return zone - var/t = rand(1, 18) // randomly pick a different zone, or maybe the same one - switch(t) - if(1) - return BODY_ZONE_HEAD - if(2) - return BODY_ZONE_CHEST - if(3 to 6) - return BODY_ZONE_L_ARM - if(7 to 10) - return BODY_ZONE_R_ARM - if(11 to 14) - return BODY_ZONE_L_LEG - if(15 to 18) - return BODY_ZONE_R_LEG - - return zone - -/proc/above_neck(zone) - var/list/zones = list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_PRECISE_EYES) + zone = check_zone(zone) + else + zone = pickweight(list(BODY_ZONE_HEAD = 6, BODY_ZONE_CHEST = 6, BODY_ZONE_L_ARM = 22, BODY_ZONE_R_ARM = 22, BODY_ZONE_L_LEG = 22, BODY_ZONE_R_LEG = 22)) + if(zones.Find(zone)) return 1 else From 2931e527773bd520f39124f42b10a70fe3c91590 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Wed, 20 Mar 2019 16:02:42 -0400 Subject: [PATCH 046/142] woops! --- code/modules/mob/mob_helpers.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index ee9a589a5c..c612f6742f 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -29,7 +29,6 @@ /proc/ran_zone(zone, probability = 80) - if(prob(probability)) return zone From c774287e2ba3671447ee55425bfb6f5cdde176c4 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Wed, 20 Mar 2019 16:06:01 -0400 Subject: [PATCH 047/142] Update mob_helpers.dm --- code/modules/mob/mob_helpers.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index c612f6742f..0725b143f2 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -30,7 +30,6 @@ /proc/ran_zone(zone, probability = 80) if(prob(probability)) - return zone zone = check_zone(zone) else From d04606acb1a04d98064741bacdf8404c33c443d2 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Wed, 20 Mar 2019 16:21:45 -0400 Subject: [PATCH 048/142] SHIFT CLICK CAT DO THE THING THAT PROPERLY DOSE THE THING --- code/modules/mob/mob_helpers.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 0725b143f2..d041836f20 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -30,11 +30,13 @@ /proc/ran_zone(zone, probability = 80) if(prob(probability)) - zone = check_zone(zone) else zone = pickweight(list(BODY_ZONE_HEAD = 6, BODY_ZONE_CHEST = 6, BODY_ZONE_L_ARM = 22, BODY_ZONE_R_ARM = 22, BODY_ZONE_L_LEG = 22, BODY_ZONE_R_LEG = 22)) - + return zone + +/proc/above_neck(zone) + var/list/zones = list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_PRECISE_EYES) if(zones.Find(zone)) return 1 else From 9d15665cbb837fbadb38ff064c92ea3f86f3da30 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Wed, 20 Mar 2019 17:12:05 -0400 Subject: [PATCH 049/142] Update packs.dm --- code/modules/cargo/packs.dm | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index a9972ca2d4..a895b31f68 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -512,6 +512,14 @@ /obj/item/storage/belt/bandolier) crate_name = "combat shotguns crate" +/datum/supply_pack/security/armory/dragnetgun + name = "DRAGnet gun Crate" + desc = "Contains two DRAGnet gun. A Dynamic Rapid-Apprehension of the Guilty net the revolution in law enforcement technology that YOU Want! Requires Armory access to open." + cost = 3500 + contains = list(/obj/item/gun/energy/e_gun/dragnet, + /obj/item/gun/energy/e_gun/dragnet) + crate_name = "anit riot net guns crate" + /datum/supply_pack/security/armory/energy name = "Energy Guns Crate" desc = "Contains three Energy Guns, capable of firing both nonlethal and lethal blasts of light. Requires Armory access to open." @@ -559,6 +567,16 @@ crate_type = /obj/structure/closet/crate/secure/plasma dangerous = TRUE +/datum/supply_pack/security/armory/miniguns + name = "Personal Miniature Energy Guns" + desc = "Contains three miniature energy guns. Each gun has a dislaber and a lethal option. Requires Armory access to open." + cost = 5000 + contains = list(/obj/item/gun/energy/e_gun/mini, + /obj/item/gun/energy/e_gun/mini, + /obj/item/gun/energy/e_gun/mini) + crate_name = "personal engery guns crate" + crate_type = /obj/structure/closet/crate/secure/plasma + /datum/supply_pack/security/armory/laserarmor name = "Reflector Vest Crate" desc = "Contains two vests of highly reflective material. Each armor piece diffuses a laser's energy by over half, as well as offering a good chance to reflect the laser entirely. Requires Armory access to open." @@ -620,6 +638,13 @@ /obj/item/clothing/gloves/combat) crate_name = "swat crate" +/datum/supply_pack/security/armory/swattasers //Lesser AEG tbh + name = "SWAT tatical tasers Crate" + desc = "Contains two tactical energy gun, these guns are able to tase, dislabe and lethal as well as hold a seclight. Requires Armory access to open." + cost = 8000 + contains = list(obj/item/gun/energy/e_gun/stun, + obj/item/gun/energy/e_gun/stun) + crate_name = "swat taser crate" /datum/supply_pack/security/armory/wt550 name = "WT-550 Semi-Auto Rifle Crate" From ee9368cadb4e7ba36333a3099a1589aea2de5d61 Mon Sep 17 00:00:00 2001 From: Ragolution Date: Wed, 20 Mar 2019 20:08:07 -0400 Subject: [PATCH 050/142] why does ghomme help us is it because he feels bad for us real deepthink --- code/modules/events/vent_clog.dm | 4 ++-- code/modules/reagents/chemistry/reagents/other_reagents.dm | 2 +- .../code/modules/reagents/reagents/cit_reagents.dm | 6 ------ 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index f84fe2edb0..86ede7f255 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -119,7 +119,7 @@ CHECK_TICK /datum/round_event/vent_clog/male/announce() - priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert") + priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejaculation of contents may occur.", "Atmospherics alert") /datum/round_event/vent_clog/male/start() for(var/obj/machinery/atmospherics/components/unary/vent in vents) @@ -134,7 +134,7 @@ CHECK_TICK /datum/round_event/vent_clog/female/announce() - priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert") + priority_announce("The scrubbers network is experiencing a backpressure squirt. Some ejection of contents may occur.", "Atmospherics alert") /datum/round_event/vent_clog/female/start() for(var/obj/machinery/atmospherics/components/unary/vent in vents) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 4b4f118a9c..15a2ef1cba 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1251,7 +1251,7 @@ L.remove_trait(TRAIT_SLEEPIMMUNE, id) ..() -/datum/reagent/stimulum/on_mob_life(mob/living/carbon/M) +/datum/reagent/stimulum/on_mob_life(mob/living/carbon/M) M.adjustStaminaLoss(-2*REM, 0) current_cycle++ holder.remove_reagent(id, 0.99) //Gives time for the next tick of life(). diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm index 30bf43bfea..ae77fbcfc0 100644 --- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm +++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm @@ -37,12 +37,6 @@ ..() dir = pick(1,2,4,8) -/* /datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume) - if(!isspaceturf(T)) - var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/semen(T) - reagentdecal.reagents.add_reagent("semen", reac_volume) -*/ - /datum/reagent/consumable/femcum name = "Female Ejaculate" id = "femcum" From 978b5261ceefe3e63762107e60df85f36d5614ce Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Wed, 20 Mar 2019 20:54:34 -0400 Subject: [PATCH 051/142] Update packs.dm --- code/modules/cargo/packs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index a895b31f68..296bdb68cd 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -640,7 +640,7 @@ /datum/supply_pack/security/armory/swattasers //Lesser AEG tbh name = "SWAT tatical tasers Crate" - desc = "Contains two tactical energy gun, these guns are able to tase, dislabe and lethal as well as hold a seclight. Requires Armory access to open." + desc = "Contains two tactical energy gun, these guns are able to tase, disable and lethal as well as hold a seclight. Requires Armory access to open." cost = 8000 contains = list(obj/item/gun/energy/e_gun/stun, obj/item/gun/energy/e_gun/stun) From bf1c8a5e7dbc166a68afcfe486468a2cc8f5b988 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Wed, 20 Mar 2019 21:09:40 -0400 Subject: [PATCH 052/142] LOCAL CAT CANT DO ANYTHING CORRECT --- code/modules/cargo/packs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 296bdb68cd..8c18786aa0 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -642,8 +642,8 @@ name = "SWAT tatical tasers Crate" desc = "Contains two tactical energy gun, these guns are able to tase, disable and lethal as well as hold a seclight. Requires Armory access to open." cost = 8000 - contains = list(obj/item/gun/energy/e_gun/stun, - obj/item/gun/energy/e_gun/stun) + contains = list(/obj/item/gun/energy/e_gun/stun, + /obj/item/gun/energy/e_gun/stun) crate_name = "swat taser crate" /datum/supply_pack/security/armory/wt550 From b20e45d3b76783f9ea87688cbb3d28a43ecb6287 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 20 Mar 2019 19:22:25 -0700 Subject: [PATCH 053/142] Update forcefieldprojector.dm --- code/game/objects/items/devices/forcefieldprojector.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index 86e98aef93..7222535fb1 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -59,6 +59,8 @@ /obj/item/forcefield_projector/Destroy() STOP_PROCESSING(SSobj, src) + for(var/i in current_fields) + qdel(i) return ..() /obj/item/forcefield_projector/process() From bd86f659c9e16f0486dec42ea2427062a07ce892 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 20 Mar 2019 19:24:42 -0700 Subject: [PATCH 054/142] Update forcefieldprojector.dm --- code/game/objects/items/devices/forcefieldprojector.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index 86e98aef93..65b0243438 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -34,6 +34,10 @@ if(LAZYLEN(current_fields) >= max_fields) to_chat(user, "[src] cannot sustain any more forcefields!") return + var/obj/structure/projected_forcefield/F = locate() in T + if(F) + to_chat(user, "There is already a forcefield on [T]!") + return playsound(src,'sound/weapons/resonator_fire.ogg',50,1) user.visible_message("[user] projects a forcefield!","You project a forcefield.") From 6e7f14db525467b5cc298cfe8fc66d24d7a502d6 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 20 Mar 2019 19:32:17 -0700 Subject: [PATCH 055/142] Update brigdoors.dm --- code/game/machinery/doors/brigdoors.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 3542b4e8bd..5c8cd4ffb8 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -71,7 +71,7 @@ return if(timing) - if(world.time - activation_time >= timer_duration) + if(world.realtime - activation_time >= timer_duration) timer_end() // open doors, reset timer, clear status screen update_icon() @@ -87,7 +87,7 @@ if(stat & (NOPOWER|BROKEN)) return 0 - activation_time = world.time + activation_time = world.realtime timing = TRUE for(var/obj/machinery/door/window/brigdoor/door in targets) @@ -136,7 +136,7 @@ /obj/machinery/door_timer/proc/time_left(seconds = FALSE) - . = max(0,timer_duration - (activation_time ? world.time - activation_time : 0)) + . = max(0,timer_duration - (activation_time ? world.realtime - activation_time : 0)) if(seconds) . /= 10 @@ -240,7 +240,7 @@ preset_time = PRESET_LONG . = set_timer(preset_time) if(timing) - activation_time = world.time + activation_time = world.realtime else . = FALSE From f9aa4f8f82bbe90d05fba9bb4f4a13b6f4bafa7d Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 20 Mar 2019 21:41:05 -0700 Subject: [PATCH 056/142] Update forcefieldprojector.dm --- code/game/objects/items/devices/forcefieldprojector.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index 65b0243438..6167df320c 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -34,8 +34,8 @@ if(LAZYLEN(current_fields) >= max_fields) to_chat(user, "[src] cannot sustain any more forcefields!") return - var/obj/structure/projected_forcefield/F = locate() in T - if(F) + var/obj/structure/projected_forcefield/same = locate() in T + if(same) to_chat(user, "There is already a forcefield on [T]!") return From 061b762b0fd7a09fef7c075c106885e7606f5f88 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 21 Mar 2019 14:06:59 -0500 Subject: [PATCH 057/142] Automatic changelog generation for PR #8132 [ci skip] --- html/changelogs/AutoChangeLog-pr-8132.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8132.yml diff --git a/html/changelogs/AutoChangeLog-pr-8132.yml b/html/changelogs/AutoChangeLog-pr-8132.yml new file mode 100644 index 0000000000..05e27044be --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8132.yml @@ -0,0 +1,4 @@ +author: "Poojawa" +delete-after: True +changes: + - bugfix: "Tauric suits now apply an (placeholder) blood overlay, as well as their shield overlay." From f06e450659d6398b70e2f7671a8d48dcf0f4284e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 21 Mar 2019 14:11:00 -0500 Subject: [PATCH 058/142] Automatic changelog generation for PR #8130 [ci skip] --- html/changelogs/AutoChangeLog-pr-8130.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8130.yml diff --git a/html/changelogs/AutoChangeLog-pr-8130.yml b/html/changelogs/AutoChangeLog-pr-8130.yml new file mode 100644 index 0000000000..ac1dd56028 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8130.yml @@ -0,0 +1,4 @@ +author: "Poojawa" +delete-after: True +changes: + - bugfix: "fixed flavor text appearing when your face is hidden but you're not an Unknown" From 0ffa3f6670ce6e1968792efd9fdbccec5aab4f74 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Thu, 21 Mar 2019 15:05:58 -0500 Subject: [PATCH 059/142] carbon Oxygen toxicity --- .../mob/living/carbon/carbon_defines.dm | 1 + .../human/species_types/lizardpeople.dm | 3 +- code/modules/mob/living/carbon/life.dm | 20 +++++++++- code/modules/surgery/organs/lungs.dm | 36 +++++++++++++++++- icons/obj/surgery.dmi | Bin 33800 -> 33847 bytes 5 files changed, 55 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index cc01a83a15..f782289e18 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -34,6 +34,7 @@ var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. var/co2overloadtime = null + var/o2overloadtime = null //for Ash walker's weaker lungs, and future atmosia hazards var/temperature_resistance = T0C+75 var/obj/item/reagent_containers/food/snacks/meat/slab/type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index e3164e0dcb..b851552dc5 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -91,6 +91,7 @@ id = "ashlizard" limbs_id = "lizard" species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE) - inherent_traits = list(TRAIT_NOGUNS,TRAIT_NOBREATH) + inherent_traits = list(TRAIT_NOGUNS) + mutantlungs = /obj/item/organ/lungs/ashwalker burnmod = 0.9 brutemod = 0.9 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index a2f6a469d9..903b136996 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -141,6 +141,7 @@ return 0 var/safe_oxy_min = 16 + var/safe_oxy_max = 50 var/safe_co2_max = 10 var/safe_tox_max = 0.05 var/SA_para_min = 1 @@ -156,6 +157,19 @@ //OXYGEN + if(O2_partialpressure > safe_oxy_max) // Too much Oxygen - blatant CO2 effect copy/pasta + if(!o2overloadtime) + o2overloadtime = world.time + else if(world.time - o2overloadtime > 120) + Dizzy(10) // better than a minute of you're fucked KO, but certainly a wake up call. Honk. + adjustOxyLoss(3) + if(world.time - o2overloadtime > 300) + adjustOxyLoss(8) + if(prob(20)) + emote("cough") + throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) + if(O2_partialpressure < safe_oxy_min) //Not enough oxygen if(prob(20)) emote("gasp") @@ -167,11 +181,13 @@ else adjustOxyLoss(3) failed_last_breath = 1 - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) + if(!o2overloadtime) + throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) else //Enough oxygen failed_last_breath = 0 + o2overloadtime = 0 //reset our counter for this too if(health >= crit_threshold) adjustOxyLoss(-5) oxygen_used = breath_gases[/datum/gas/oxygen][MOLES] diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 6ec1ea12d9..56aa715190 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -9,7 +9,7 @@ //Breath damage var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa - var/safe_oxygen_max = 0 + var/safe_oxygen_max = 50 // Too much of a good thing, in kPa as well. var/safe_nitro_min = 0 var/safe_nitro_max = 0 var/safe_co2_min = 0 @@ -97,11 +97,25 @@ //Too much oxygen! //Yes, some species may not like it. if(safe_oxygen_max) - if(O2_pp > safe_oxygen_max) + if((O2_pp > safe_oxygen_max) && safe_oxygen_max == 0) //I guess plasma men technically need to have a check. var/ratio = (breath_gases[/datum/gas/oxygen][MOLES]/safe_oxygen_max) * 10 H.apply_damage_type(CLAMP(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type) H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy) + + else if((O2_pp > safe_oxygen_max) && !(safe_oxygen_max == 0)) //Why yes, this is like too much CO2 and spahget. Dirty lizards. + if(!H.o2overloadtime) + H.o2overloadtime = world.time + else if(world.time - H.o2overloadtime > 120) + H.Dizzy(10) // better than a minute of you're fucked KO, but certainly a wake up call. Honk. + H.adjustOxyLoss(3) + if(world.time - H.o2overloadtime > 300) + H.adjustOxyLoss(8) + if(prob(20)) + H.emote("cough") + H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy) + else + H.o2overloadtime = 0 H.clear_alert("too_much_oxy") //Too little oxygen! @@ -129,6 +143,7 @@ var/ratio = (breath_gases[/datum/gas/nitrogen][MOLES]/safe_nitro_max) * 10 H.apply_damage_type(CLAMP(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type) H.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro) + H.losebreath += 2 else H.clear_alert("too_much_nitro") @@ -407,7 +422,24 @@ icon_state = "lungs-c-u" safe_toxins_max = 20 safe_co2_max = 20 + safe_oxygen_max = 250 cold_level_1_threshold = 200 cold_level_2_threshold = 140 cold_level_3_threshold = 100 + +/obj/item/organ/lungs/ashwalker + name = "ash lungs" + desc = "blackened lungs identical from specimens recovered from lavaland, unsuited to higher air pressures." + icon_state = "lungs-ll" + safe_oxygen_min = 3 //able to handle much thinner oxygen, something something ash storm adaptation + safe_oxygen_max = 18 // Air standard is 22kpA of O2, LL is 14kpA + safe_nitro_max = 28 // Air standard is 82kpA of N2, LL is 23kpA + + cold_level_1_threshold = 280 // Ash Lizards can't take the cold very well, station air is only just warm enough + cold_level_2_threshold = 240 + cold_level_3_threshold = 200 + + heat_level_1_threshold = 400 // better adapted for heat, obv. Lavaland standard is 300 + heat_level_2_threshold = 600 // up 200 from level 1, 1000 is silly but w/e for level 3 + diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index e3a0d595a62a89c0933667f4befaf34db586053b..4ab614cf83ab404dc5a27dc2e6c3710307ea194d 100755 GIT binary patch literal 33847 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 VN*Q9w^#ut6WF-|OO2rNQ{s&{n!>#}T literal 33800 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

XJxY_)!2T#IBJtVNSsIS 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

)sqRxrUpFqBj;CgO6xL{rV|-FyBjOq{WJ4SW%P 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 Hn*{t9lMUxL From fbc2b15d21d05e07fb3be0a37dde1336aa3dcc57 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Thu, 21 Mar 2019 15:13:11 -0500 Subject: [PATCH 060/142] Make sure the oxygen max doesn't do fucky things --- code/modules/surgery/organs/lungs.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 56aa715190..1e22796b1b 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -400,6 +400,7 @@ icon_state = "lungs-plasma" safe_oxygen_min = 0 //We don't breath this + safe_oxygen_max = 0 // Like, at all. safe_toxins_min = 16 //We breath THIS! safe_toxins_max = 0 From 8893108130467ae9541976bf29aabaf32994c5a3 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Thu, 21 Mar 2019 15:15:47 -0500 Subject: [PATCH 061/142] actually completely pointless of a check, so let's not fuck with it --- code/modules/mob/living/carbon/life.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 903b136996..48a401802b 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -181,9 +181,8 @@ else adjustOxyLoss(3) failed_last_breath = 1 - if(!o2overloadtime) - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) + throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) else //Enough oxygen failed_last_breath = 0 From c8cd7d89b6ca12018ee62ce82b16194550a8c367 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Thu, 21 Mar 2019 15:31:07 -0500 Subject: [PATCH 062/142] fixes overbright digi legs on lizards also removes their excessive snouts to stop being abominations --- icons/mob/human_parts_greyscale.dmi | Bin 39657 -> 39247 bytes .../mob/dead/new_player/sprite_accessories.dm | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index 47ef8e816fa817417e4f9a9650b9bb6fb4dc0014..a8d2a2aef3e1c7a78073c02ad3e788f97a5d86cb 100644 GIT binary patch delta 19449 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 MwJvEEsNW3zUo&X6oB#j- diff --git a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm index bd301a2e85..ecb4a57407 100644 --- a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -36,7 +36,8 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' -/************* Lizard compatable snoots ************/ +//christ this was a mistake, but it's here just in case someone wants to selectively fix +/************* Lizard compatable snoots *********** /datum/sprite_accessory/snouts/bird name = "Beak" icon_state = "bird" @@ -155,6 +156,7 @@ icon_state = "toucan" icon = 'modular_citadel/icons/mob/mam_snouts.dmi' color_src = MATRIXED +*/ /****************************************** ************ Human Ears/Tails ************* From e00c196824a4bd08246b5b5c3a0b971384be3097 Mon Sep 17 00:00:00 2001 From: Ragolution Date: Thu, 21 Mar 2019 19:07:22 -0400 Subject: [PATCH 063/142] CALL IT A MEME PR ONE MORE TIME AND SEE WHAT HAPPENS bottom text --- code/modules/surgery/advanced/revival.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm index 4ba8660855..0cd7a64235 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/advanced/revival.dm @@ -26,7 +26,7 @@ return TRUE /datum/surgery_step/revive - name = "electric stimulation" + name = "electrically stimulate brain" implements = list(/obj/item/twohanded/shockpaddles = 100, /obj/item/abductor/gizmo = 100, /obj/item/melee/baton = 75, /obj/item/organ/cyberimp/arm/baton = 75, /obj/item/organ/cyberimp/arm/gun/taser = 60, /obj/item/gun/energy/e_gun/advtaser = 60, /obj/item/gun/energy/taser = 60) time = 120 From ae02f091ff3c27bef7a684717dc345d80739eb65 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Fri, 22 Mar 2019 15:06:36 -0500 Subject: [PATCH 064/142] Dragon fixes, UI fixes --- code/__DEFINES/voreconstants.dm | 123 +++--------------- .../living/simple_animal/hostile/hostile.dm | 6 +- .../hostile/megafauna/megafauna.dm | 16 +-- .../code/modules/vore/eating/belly_obj_vr.dm | 25 ++-- .../code/modules/vore/eating/bellymodes_vr.dm | 2 +- .../code/modules/vore/eating/vorepanel_vr.dm | 118 ++++++++--------- 6 files changed, 93 insertions(+), 197 deletions(-) diff --git a/code/__DEFINES/voreconstants.dm b/code/__DEFINES/voreconstants.dm index a133297315..a396cf9962 100644 --- a/code/__DEFINES/voreconstants.dm +++ b/code/__DEFINES/voreconstants.dm @@ -18,39 +18,6 @@ /* // removing sizeplay again GLOBAL_LIST_INIT(player_sizes_list, list("Macro" = SIZESCALE_HUGE, "Big" = SIZESCALE_BIG, "Normal" = SIZESCALE_NORMAL, "Small" = SIZESCALE_SMALL, "Tiny" = SIZESCALE_TINY)) // Edited to make the new travis check go away - - -GLOBAL_LIST_INIT(digest_pred, list( - 'sound/vore/pred/digest_01.ogg', - 'sound/vore/pred/digest_02.ogg', - 'sound/vore/pred/digest_03.ogg', - 'sound/vore/pred/digest_04.ogg', - 'sound/vore/pred/digest_05.ogg', - 'sound/vore/pred/digest_06.ogg', - 'sound/vore/pred/digest_07.ogg', - 'sound/vore/pred/digest_08.ogg', - 'sound/vore/pred/digest_09.ogg', - 'sound/vore/pred/digest_10.ogg', - 'sound/vore/pred/digest_11.ogg', - 'sound/vore/pred/digest_12.ogg', - 'sound/vore/pred/digest_13.ogg', - 'sound/vore/pred/digest_14.ogg', - 'sound/vore/pred/digest_15.ogg', - 'sound/vore/pred/digest_16.ogg', - 'sound/vore/pred/digest_17.ogg', - 'sound/vore/pred/digest_18.ogg')) - -GLOBAL_LIST_INIT(death_pred, list( - 'sound/vore/pred/death_01.ogg', - 'sound/vore/pred/death_02.ogg', - 'sound/vore/pred/death_03.ogg', - 'sound/vore/pred/death_04.ogg', - 'sound/vore/pred/death_05.ogg', - 'sound/vore/pred/death_06.ogg', - 'sound/vore/pred/death_07.ogg', - 'sound/vore/pred/death_08.ogg', - 'sound/vore/pred/death_09.ogg', - 'sound/vore/pred/death_10.ogg')) */ GLOBAL_LIST_INIT(vore_sounds, list( @@ -66,79 +33,21 @@ GLOBAL_LIST_INIT(vore_sounds, list( "Squish3" = 'sound/vore/pred/squish_03.ogg', "Squish4" = 'sound/vore/pred/squish_04.ogg', "Rustle (cloth)" = 'sound/effects/rustle5.ogg', - "rustle2(cloth)" = 'sound/effects/rustle2.ogg', - "rustle3(cloth)" = 'sound/effects/rustle3.ogg', - "rustle4(cloth)" = 'sound/effects/rustle4.ogg', - "rustle5(cloth)" = 'sound/effects/rustle5.ogg', - "None" = null)) -/* -GLOBAL_LIST_INIT(pred_struggle_sounds, list( - "Struggle1" = 'sound/vore/pred/struggle_01.ogg', - "Struggle2" = 'sound/vore/pred/struggle_02.ogg', - "Struggle3" = 'sound/vore/pred/struggle_03.ogg', - "Struggle4" = 'sound/vore/pred/struggle_04.ogg', - "Struggle5" = 'sound/vore/pred/struggle_05.ogg')) - -GLOBAL_LIST_INIT(prey_vore_sounds, list( - "Gulp" = 'sound/vore/prey/swallow_01.ogg', - "Swallow" = 'sound/vore/prey/swallow_02.ogg', - "Insertion1" = 'sound/vore/prey/insertion_01.ogg', - "Insertion2" = 'sound/vore/prey/insertion_02.ogg', - "Tauric Swallow" = 'sound/vore/prey/taurswallow.ogg', - "Schlorp" = 'sound/vore/prey/schlorp.ogg', - "Squish1" = 'sound/vore/prey/squish_01.ogg', - "Squish2" = 'sound/vore/prey/squish_02.ogg', - "Squish3" = 'sound/vore/prey/squish_03.ogg', - "Squish4" = 'sound/vore/prey/squish_04.ogg')) - - -GLOBAL_LIST_INIT(prey_struggle_sounds, list( - "Struggle1" = 'sound/vore/prey/struggle_01.ogg', - "Struggle2" = 'sound/vore/prey/struggle_02.ogg', - "Struggle3" = 'sound/vore/prey/struggle_03.ogg', - "Struggle4" = 'sound/vore/prey/struggle_04.ogg', - "Struggle5" = 'sound/vore/prey/struggle_05.ogg')) - -GLOBAL_LIST_INIT(digest_prey, list( - "digest1" = 'sound/vore/prey/digest_01.ogg', - "digest2" = 'sound/vore/prey/digest_02.ogg', - "digest3" = 'sound/vore/prey/digest_03.ogg', - "digest4" = 'sound/vore/prey/digest_04.ogg', - "digest5" = 'sound/vore/prey/digest_05.ogg', - "digest6" = 'sound/vore/prey/digest_06.ogg', - "digest7" = 'sound/vore/prey/digest_07.ogg', - "digest8" = 'sound/vore/prey/digest_08.ogg', - "digest9" = 'sound/vore/prey/digest_09.ogg', - "digest10" = 'sound/vore/prey/digest_10.ogg', - "digest11" = 'sound/vore/prey/digest_11.ogg', - "digest12" = 'sound/vore/prey/digest_12.ogg', - "digest13" = 'sound/vore/prey/digest_13.ogg', - "digest14" = 'sound/vore/prey/digest_14.ogg', - "digest15" = 'sound/vore/prey/digest_15.ogg', - "digest16" = 'sound/vore/prey/digest_16.ogg', - "digest17" = 'sound/vore/prey/digest_17.ogg', - "digest18" = 'sound/vore/prey/digest_18.ogg')) - -GLOBAL_LIST_INIT(death_prey, list( - "death1" = 'sound/vore/prey/death_01.ogg', - "death2" = 'sound/vore/prey/death_02.ogg', - "death3" = 'sound/vore/prey/death_03.ogg', - "death4" = 'sound/vore/prey/death_04.ogg', - "death5" = 'sound/vore/prey/death_05.ogg', - "death6" = 'sound/vore/prey/death_06.ogg', - "death7" = 'sound/vore/prey/death_07.ogg', - "death8" = 'sound/vore/prey/death_08.ogg', - "death9" = 'sound/vore/prey/death_09.ogg', - "death10" = 'sound/vore/prey/death_10.ogg')) - */ + "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg', + "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', + "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', + "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', + "None" = null + )) GLOBAL_LIST_INIT(release_sounds, list( - "rustle (cloth)" = 'sound/effects/rustle1.ogg', - "rustle2 (cloth)" = 'sound/effects/rustle2.ogg', - "rustle3 (cloth)" = 'sound/effects/rustle3.ogg', - "rustle4 (cloth)" = 'sound/effects/rustle4.ogg', - "rustle5 (cloth)" = 'sound/effects/rustle5.ogg', - "Stomach Move" = 'sound/vore/pred/stomachmove.ogg', - "Pred Escape" = 'sound/vore/pred/escape.ogg', - "Splatter" = 'sound/effects/splat.ogg', - "None" = null)) \ No newline at end of file + "Rustle (cloth)" = 'sound/effects/rustle1.ogg', + "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg', + "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', + "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', + "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', + "Stomach Move" = 'sound/vore/pred/stomachmove.ogg', + "Pred Escape" = 'sound/vore/pred/escape.ogg', + "Splatter" = 'sound/effects/splat.ogg', + "None" = null + ) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index d8635060ee..941ba0ec69 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -100,7 +100,7 @@ if(!target || !isturf(target.loc) || !isturf(loc) || stat == DEAD) return var/target_dir = get_dir(src,target) - + var/static/list/cardinal_sidestep_directions = list(-90,-45,0,45,90) var/static/list/diagonal_sidestep_directions = list(-45,0,45) var/chosen_dir = 0 @@ -202,6 +202,8 @@ if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it return FALSE + if(isbelly(the_target.loc)) //Target's inside a gut, forget about it too + return FALSE if(search_objects < 2) if(isliving(the_target)) var/mob/living/L = the_target @@ -301,7 +303,7 @@ if(target) if(targets_from && isturf(targets_from.loc) && target.Adjacent(targets_from)) //If they're next to us, attack MeleeAction() - else + else if(rapid_melee > 1 && target_distance <= melee_queue_distance) MeleeAction(FALSE) in_melee = FALSE //If we're just preparing to strike do not enter sidestep mode diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 43bc2c26f8..92ac07b1a0 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -83,18 +83,12 @@ if(L.stat != DEAD) if(!client && ranged && ranged_cooldown <= world.time) OpenFire() - - else if(L.stat >= SOFT_CRIT) - if(vore_active == TRUE && L.devourable == TRUE) - if(isliving(target) && !target.Adjacent(targets_from)) - return - else + if(L.Adjacent(src) && (L.stat != CONSCIOUS)) + if(vore_active && L.devourable == TRUE) dragon_feeding(src,L) - if(L.loc == src.contents) - LoseTarget() - return 0 - else - devour(L) + LoseTarget() + else + devour(L) /mob/living/simple_animal/hostile/megafauna/proc/devour(mob/living/L) if(!L) diff --git a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm index e76a09d4b7..142e5880d5 100644 --- a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm +++ b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm @@ -15,7 +15,7 @@ desc = "It's a belly! You're in it!" // Flavor text description of inside sight/sound/smells/feels. var/vore_sound = "Gulp" // Sound when ingesting someone var/vore_verb = "ingest" // Verb for eating with this in messages - var/release_sound = "Splatter" + var/release_sound = "Splatter" // Sound for letting someone out. var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human var/nonhuman_prey_swallow_time = 30 // Time in deciseconds to swallow anything else var/emote_time = 60 SECONDS // How long between stomach emotes at prey @@ -30,7 +30,6 @@ var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone. var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine. // var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to. - var/silent = FALSE var/transferlocation // Location that the prey is released if they struggle and get dropped off. var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting @@ -127,7 +126,6 @@ "escapechance", "can_taste", "bulge_size", - "silent", "transferlocation", "transferchance", "autotransferchance", @@ -170,7 +168,7 @@ //Sound w/ antispam flag setting if(is_wet && !recent_sound) - for(var/mob/M in get_hearers_in_view(5, get_turf(owner))) + for(var/mob/M in get_hearers_in_view(2, get_turf(owner))) if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES)) playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) recent_sound = TRUE @@ -184,7 +182,7 @@ // Release all contents of this belly into the owning mob's location. // If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in. // Returns the number of mobs so released. -/obj/belly/proc/release_all_contents(var/include_absorbed = FALSE) +/obj/belly/proc/release_all_contents(var/include_absorbed = FALSE, var/silent = FALSE) var/atom/destination = drop_location() var/count = 0 for(var/thing in contents) @@ -203,7 +201,7 @@ SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "emptyprey", /datum/mood_event/emptyprey) AM.forceMove(destination) // Move the belly contents into the same location as belly's owner. count++ - for(var/mob/M in get_hearers_in_view(5, get_turf(owner))) + for(var/mob/M in get_hearers_in_view(2, get_turf(owner))) if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES)) playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) if(!silent) @@ -216,16 +214,15 @@ // Release a specific atom from the contents of this belly into the owning mob's location. // If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in. // Returns the number of atoms so released. -/obj/belly/proc/release_specific_contents(var/atom/movable/M) +/obj/belly/proc/release_specific_contents(var/atom/movable/M, var/silent = FALSE) if (!(M in contents)) return FALSE // They weren't in this belly anyway M.forceMove(drop_location()) // Move the belly contents into the same location as belly's owner. items_preserved -= M - if(release_sound) - for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) - if(H.client && (H.client.prefs.cit_toggles & EATING_NOISES)) - playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + for(var/mob/H in get_hearers_in_view(2, get_turf(owner))) + if(H.client && (H.client.prefs.cit_toggles & EATING_NOISES)) + playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) if(istype(M,/mob/living)) var/mob/living/ML = M @@ -515,6 +512,11 @@ var/sound/prey_struggle = sound(get_sfx("prey_struggle")) R.playsound_local(get_turf(R),prey_struggle,45,0) + else + for(var/mob/M in get_hearers_in_view(2, get_turf(owner))) + if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES)) + playsound(get_turf(owner),"rustle",35,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED) + for(var/mob/M in get_hearers_in_view(3, get_turf(owner))) if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES)) //Might as well censor the normies here too. M.show_message(struggle_outer_message, 1) // visible @@ -608,7 +610,6 @@ dupe.escapechance = escapechance dupe.can_taste = can_taste dupe.bulge_size = bulge_size - dupe.silent = silent dupe.transferlocation = transferlocation dupe.transferchance = transferchance dupe.autotransferchance = autotransferchance diff --git a/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm b/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm index 6c528f75a9..542241e9f2 100644 --- a/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm +++ b/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm @@ -25,7 +25,7 @@ for(var/mob/living/M in contents) if(isbelly(M.loc)) if(world.time > M.next_preyloop) - if(!silent) + if(is_wet) M.stop_sound_channel(CHANNEL_PREYLOOP) // sanity just in case var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE) M.playsound_local(get_turf(src),preyloop,80,0, channel = CHANNEL_PREYLOOP) diff --git a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm index bc30de6ca6..3d20526a5c 100644 --- a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm +++ b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm @@ -18,9 +18,10 @@ var/dat = picker_holder.gen_vui(src) - picker_holder.popup = new(src, "insidePanel","Vore Panel", 400, 600, picker_holder) + picker_holder.popup = new(src, "insidePanel","Vore Panel", 450, 700, picker_holder) picker_holder.popup.set_content(dat) picker_holder.popup.open() + src.openpanel = 1 /mob/living/proc/updateVRPanel() //Panel popup update call from belly events. if(src.openpanel == 1) @@ -30,7 +31,7 @@ var/dat = picker_holder.gen_vui(src) - picker_holder.popup = new(src, "insidePanel","Vore Panel", 400, 600, picker_holder) + picker_holder.popup = new(src, "insidePanel","Vore Panel", 450, 700, picker_holder) picker_holder.popup.set_content(dat) picker_holder.popup.open() @@ -39,7 +40,7 @@ // /datum/vore_look var/obj/belly/selected - var/show_interacts = TRUE + var/show_interacts = 0 var/datum/browser/popup var/loop = null; // Magic self-reference to stop the handler from being GC'd before user takes action. @@ -61,7 +62,7 @@ var/obj/belly/inside_belly = userloc var/mob/living/eater = inside_belly.owner - //Don't display this part if we couldn't find the belly since could be held in hand. + //Don't display this part if we couldn't find the belly since could be held in hand. if(inside_belly) dat += "You are currently [user.absorbed ? "absorbed into " : "inside "] [eater]'s [inside_belly]!

" @@ -102,7 +103,6 @@ dat += "

  • [B.name]" else dat += "
  • [B.name]" - var/spanstyle switch(B.digest_mode) if(DM_HOLD) @@ -157,7 +157,7 @@ dat += " '[selected.name]'" //Belly Type button - dat += "Has Flesh Noises?" + dat += "
    Is Fleshy:" dat += "[selected.is_wet ? "Yes" : "No"]" //Digest Mode Button @@ -173,11 +173,11 @@ dat += " '[selected.desc]'" //Belly sound - dat += "
    Set Vore Sound" + dat += "
    Vore Sound: [selected.vore_sound]" dat += "Test" //Release sound - dat += "
    Set Release Sound" + dat += "
    Release Sound: [selected.release_sound]" dat += "Test" //Belly messages @@ -205,10 +205,6 @@ dat += "
    Set Belly Escape Time" dat += " [selected.escapetime/10]s" - dat += "
    " - dat += "
    Set Belly Absorb Chance" - dat += " [selected.absorbchance]%" - //Special
    here to add a gap dat += "
    " dat += "
    Set Belly Transfer Chance" @@ -219,14 +215,13 @@ //Special
    here to add a gap dat += "
    " + dat += "
    Set Belly Absorb Chance" + dat += " [selected.absorbchance]%" + dat += "
    Set Belly Digest Chance" dat += " [selected.digestchance]%" dat += "
    " - // Belly Silence - dat += "
    Belly Silence (for not belly bellies):" - dat += " [selected.silent ? "Yes" : "No"]" - //Delete button dat += "
    Delete Belly" @@ -262,25 +257,26 @@ if(href_list["close"]) qdel(src) // Cleanup + user.openpanel = 0 return if(href_list["show_int"]) show_interacts = !show_interacts - return TRUE //Force update + return 1 //Force update if(href_list["int_help"]) - to_chat(usr,"These control how your belly responds to someone using 'resist' while inside you. The percent chance to trigger each is listed below, \ + alert("These control how your belly responds to someone using 'resist' while inside you. The percent chance to trigger each is listed below, \ and you can change them to whatever you see fit. Setting them to 0% will disable the possibility of that interaction. \ - These only function as long as interactions are turned on in general. Keep in mind, the 'belly mode' interactions (digest) \ - will affect all prey in that belly, if one resists and triggers digestion. If multiple trigger at the same time, \ - only the first in the order of 'Escape > Transfer > Absorb > Digest' will occur.") - return TRUE //Force update + These only function as long as interactions are turned on in general. Keep in mind, the 'belly mode' interactions (digest/absorb) \ + will affect all prey in that belly, if one resists and triggers digestion/absorption. If multiple trigger at the same time, \ + only the first in the order of 'Escape > Transfer > Absorb > Digest' will occur.","Interactions Help") + return 0 //Force update if(href_list["outsidepick"]) var/atom/movable/tgt = locate(href_list["outsidepick"]) var/obj/belly/OB = locate(href_list["outsidebelly"]) if(!(tgt in OB)) //Aren't here anymore, need to update menu. - return TRUE + return 1 var/intent = "Examine" if(istype(tgt,/mob/living)) @@ -293,11 +289,11 @@ if("Help Out") //Help the inside-mob out if(user.stat || user.absorbed || M.absorbed) to_chat(user,"You can't do that in your state!") - return + return 1 to_chat(user,"You begin to push [M] to freedom!") to_chat(M,"[usr] begins to push you to freedom!") - to_chat(OB.owner,"Someone is trying to escape from inside you!") + to_chat(M.loc,"Someone is trying to escape from inside you!") sleep(50) if(prob(33)) OB.release_specific_contents(M) @@ -309,15 +305,14 @@ to_chat(M," Even with [user]'s help, you slip back inside again.") to_chat(OB.owner,"Your body efficiently shoves [M] back where they belong.") - if("Devour") //Eat the inside mob if(user.absorbed || user.stat) to_chat(user,"You can't do that in your state!") - return + return 1 if(!user.vore_selected) to_chat(user,"Pick a belly on yourself first!") - return + return 1 var/obj/belly/TB = user.vore_selected to_chat(user,"You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") @@ -333,9 +328,9 @@ else if(istype(tgt,/obj/item)) var/obj/item/T = tgt - if(!(tgt in OB.contents)) + if(!(tgt in OB)) //Doesn't exist anymore, update. - return TRUE + return 1 intent = alert("What do you want to do to that?","Query","Examine","Use Hand") switch(intent) if("Examine") @@ -343,8 +338,8 @@ if("Use Hand") if(user.stat) - to_chat(user, "You can't do that in your state!") - return + to_chat(user,"You can't do that in your state!") + return 1 user.ClickOn(T) sleep(5) //Seems to exit too fast for the panel to update @@ -357,32 +352,31 @@ intent = alert("Eject all, Move all?","Query","Eject all","Cancel","Move all") switch(intent) if("Cancel") - return + return 0 if("Eject all") if(user.stat) - to_chat(user, "You can't do that in your state!") - return + to_chat(user,"You can't do that in your state!") + return 0 selected.release_all_contents() - to_chat(user.loc,"Everything is released from [user]!") if("Move all") if(user.stat) - to_chat(user, "You can't do that in your state!") - return FALSE + to_chat(user,"You can't do that in your state!") + return 0 var/obj/belly/choice = input("Move all where?","Select Belly") as null|anything in user.vore_organs if(!choice) - return FALSE + return 0 for(var/atom/movable/tgt in selected) - selected.transfer_contents(tgt, choice, 1) to_chat(tgt,"You're squished from [user]'s [lowertext(selected)] to their [lowertext(choice.name)]!") + selected.transfer_contents(tgt, choice, 1) var/atom/movable/tgt = locate(href_list["insidepick"]) if(!(tgt in selected)) //Old menu, needs updating because they aren't really there. - return TRUE//Forces update + return 1 //Forces update intent = "Examine" intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move") switch(intent) @@ -391,11 +385,10 @@ if("Eject") if(user.stat) - to_chat(user, "You can't do that in your state!") - return FALSE + to_chat(user,"You can't do that in your state!") + return 0 selected.release_specific_contents(tgt) - user.loc << "[tgt] is released from [user]!" if("Move") if(user.stat) @@ -547,7 +540,7 @@ if(!choice) return - selected.release_sound = GLOB.release_sounds[choice] + selected.release_sound = choice if(href_list["b_releasesoundtest"]) var/soundfile = selected.release_sound @@ -560,7 +553,7 @@ if(!choice) return - selected.vore_sound = GLOB.vore_sounds[choice] + selected.vore_sound = choice if(href_list["b_soundtest"]) var/soundfile = selected.vore_sound @@ -584,17 +577,17 @@ selected.bulge_size = (new_bulge/100) if(href_list["b_escapable"]) - if(selected.escapable == FALSE) //Possibly escapable and special interactions. - selected.escapable = TRUE - to_chat(usr,"Prey now have special interactions with your [selected.name] depending on your settings.") - else if(selected.escapable == TRUE) //Never escapable. - selected.escapable = FALSE - to_chat(usr,"Prey will not be able to have special interactions with your [selected.name].") - show_interacts = FALSE //Force the hiding of the panel + if(selected.escapable == 0) //Possibly escapable and special interactions. + selected.escapable = 1 + to_chat(usr,"Prey now have special interactions with your [lowertext(selected.name)] depending on your settings.") + else if(selected.escapable == 1) //Never escapable. + selected.escapable = 0 + to_chat(usr,"Prey will not be able to have special interactions with your [lowertext(selected.name)].") + show_interacts = 0 //Force the hiding of the panel else - to_chat(usr,"Something went wrong. Your stomach will now not have special interactions. Press the button enable them again and tell a dev.") //If they somehow have a varable that's not 0 or 1 - selected.escapable = TRUE - show_interacts = FALSE //Force the hiding of the panel + alert("Something went wrong. Your stomach will now not have special interactions. Press the button enable them again and tell a dev.","Error") //If they somehow have a varable that's not 0 or 1 + selected.escapable = 0 + show_interacts = 0 //Force the hiding of the panel if(href_list["b_escapechance"]) var/escape_chance_input = input(user, "Set prey escape chance on resist (as %)", "Prey Escape Chance") as num|null @@ -612,14 +605,14 @@ selected.transferchance = sanitize_integer(transfer_chance_input, 0, 100, initial(selected.transferchance)) if(href_list["b_transferlocation"]) - var/choice = input("Where do you want your [selected.name] to lead if prey resists?","Select Belly") as null|anything in (user.vore_organs + "None - Remove" - selected.name) + var/obj/belly/choice = input("Where do you want your [lowertext(selected.name)] to lead if prey resists?","Select Belly") as null|anything in (user.vore_organs + "None - Remove" - selected) if(!choice) //They cancelled, no changes - return FALSE + return 0 else if(choice == "None - Remove") selected.transferlocation = null else - selected.transferlocation = user.vore_organs[choice] + selected.transferlocation = choice.name if(href_list["b_absorbchance"]) var/absorb_chance_input = input(user, "Set belly absorb mode chance on resist (as %)", "Prey Absorb Chance") as num|null @@ -631,13 +624,10 @@ if(!isnull(digest_chance_input)) selected.digestchance = sanitize_integer(digest_chance_input, 0, 100, initial(selected.digestchance)) - if(href_list["b_silent"]) - selected.silent = !selected.silent - if(href_list["b_del"]) var/alert = alert("Are you sure you want to delete your [lowertext(selected.name)]?","Confirmation","Delete","Cancel") if(!alert == "Delete") - return FALSE + return 0 var/failure_msg = "" @@ -658,7 +648,7 @@ if(failure_msg) alert(user,failure_msg,"Error!") - return FALSE + return 0 qdel(selected) selected = user.vore_organs[1] From df0aa7cadbcf907dc4105570475a5644af247834 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Fri, 22 Mar 2019 17:16:38 -0500 Subject: [PATCH 065/142] missing ) in macro call --- code/__DEFINES/voreconstants.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/voreconstants.dm b/code/__DEFINES/voreconstants.dm index a396cf9962..710b11ae16 100644 --- a/code/__DEFINES/voreconstants.dm +++ b/code/__DEFINES/voreconstants.dm @@ -50,4 +50,4 @@ GLOBAL_LIST_INIT(release_sounds, list( "Pred Escape" = 'sound/vore/pred/escape.ogg', "Splatter" = 'sound/effects/splat.ogg', "None" = null - ) + )) From 292af850af17504f6735f550532c28080252c8fa Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 22 Mar 2019 18:22:46 -0500 Subject: [PATCH 066/142] Automatic changelog generation for PR #8141 [ci skip] --- html/changelogs/AutoChangeLog-pr-8141.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8141.yml diff --git a/html/changelogs/AutoChangeLog-pr-8141.yml b/html/changelogs/AutoChangeLog-pr-8141.yml new file mode 100644 index 0000000000..2a465b21e5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8141.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - tweak: "Ballistic projectiles are now the only projectiles capable of emitting dinks." From 08964ee5419e7fd5e088be6eb596fcbb58ca88aa Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 22 Mar 2019 18:23:02 -0500 Subject: [PATCH 067/142] Automatic changelog generation for PR #8140 [ci skip] --- html/changelogs/AutoChangeLog-pr-8140.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8140.yml diff --git a/html/changelogs/AutoChangeLog-pr-8140.yml b/html/changelogs/AutoChangeLog-pr-8140.yml new file mode 100644 index 0000000000..ae21917771 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8140.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - code_imp: "In an attempt to improve performance during highpop, mouse movements will now only call onmousemove() while a user is in combat mode" From 137b8f80637a5e84c9533f1438b3fb95f6782847 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 22 Mar 2019 21:13:22 -0500 Subject: [PATCH 068/142] Automatic changelog generation for PR #8145 [ci skip] --- html/changelogs/AutoChangeLog-pr-8145.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8145.yml diff --git a/html/changelogs/AutoChangeLog-pr-8145.yml b/html/changelogs/AutoChangeLog-pr-8145.yml new file mode 100644 index 0000000000..55cd6c378b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8145.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - admin: "Panic bunker toggling and bypassing is now logged in admin IRC" From 996e3c8f4751c2f8a4e8bf366feedbd20d3d6d44 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 22 Mar 2019 21:14:12 -0500 Subject: [PATCH 069/142] Automatic changelog generation for PR #8118 [ci skip] --- html/changelogs/AutoChangeLog-pr-8118.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8118.yml diff --git a/html/changelogs/AutoChangeLog-pr-8118.yml b/html/changelogs/AutoChangeLog-pr-8118.yml new file mode 100644 index 0000000000..be5c0871ab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8118.yml @@ -0,0 +1,6 @@ +author: "deathride58" +delete-after: True +changes: + - tweak: "Ghost role eligibility for both event and spawner ghost roles is now affected by DNR status. If you suicide, ghost, or cryo out, you will be unable to qualify for any ghost roles" + - tweak: "Cryo now applies DNR status no matter how long the round has been going on" + - tweak: "Suicide is now properly admin logged as it is supposed to be. Ghosting while alive is now also logged." From 869933b786b3ec5026c3b0463b23e9633a5d9069 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 22 Mar 2019 21:16:19 -0500 Subject: [PATCH 070/142] Automatic changelog generation for PR #8146 [ci skip] --- html/changelogs/AutoChangeLog-pr-8146.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8146.yml diff --git a/html/changelogs/AutoChangeLog-pr-8146.yml b/html/changelogs/AutoChangeLog-pr-8146.yml new file mode 100644 index 0000000000..566532fdd3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8146.yml @@ -0,0 +1,5 @@ +author: "deathride58" +delete-after: True +changes: + - tweak: "OOC and LOOC now use separate toggles. You can now use LOOC while OOC is globally toggled off, and admins now have the option to toggle LOOC off separately from OOC" + - code_imp: "also revamped and reorganized relevant looc adminverb code" From 520f46c9330ab71223c13477f760623f60fc8349 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 22 Mar 2019 21:23:04 -0500 Subject: [PATCH 071/142] Automatic changelog generation for PR #8160 [ci skip] --- html/changelogs/AutoChangeLog-pr-8160.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8160.yml diff --git a/html/changelogs/AutoChangeLog-pr-8160.yml b/html/changelogs/AutoChangeLog-pr-8160.yml new file mode 100644 index 0000000000..33d2445f48 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8160.yml @@ -0,0 +1,5 @@ +author: "Poojawa" +delete-after: True +changes: + - bugfix: "Digitigrade legs returned to normal, since digi leg markings overlay them anyway." + - bugfix: "commented out lizard mam_snout entries, because too many abominations" From e8dcb44317f312e3347fbc7d6455895a90f1eeed Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sat, 23 Mar 2019 07:43:55 -0500 Subject: [PATCH 072/142] Prevents teleport mice teeth --- code/modules/mob/living/simple_animal/friendly/mouse.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 8c6300fab5..6ec95084dd 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -63,6 +63,9 @@ ..() /mob/living/simple_animal/mouse/handle_automated_action() + if(isbelly(loc) + return + if(prob(chew_probability)) var/turf/open/floor/F = get_turf(src) if(istype(F) && !F.intact) From bdfc3273b8e006f39f1170da8fea231ed133c69d Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sat, 23 Mar 2019 07:44:29 -0500 Subject: [PATCH 073/142] oops I commited before test compiling --- code/modules/mob/living/simple_animal/friendly/mouse.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 6ec95084dd..bf45c9cc73 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -63,7 +63,7 @@ ..() /mob/living/simple_animal/mouse/handle_automated_action() - if(isbelly(loc) + if(isbelly(loc)) return if(prob(chew_probability)) From 3175bf1db98377ce435e698c89220403d5ab7aa0 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 23 Mar 2019 12:37:03 -0700 Subject: [PATCH 074/142] Update pyrotechnics.dm --- .../chemistry/recipes/pyrotechnics.dm | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 587d6c8b38..eec94c7b35 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -3,23 +3,25 @@ id = "reagent_explosion" var/strengthdiv = 10 var/modifier = 0 + var/noexplosion = FALSE -/datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, created_volume) - var/turf/T = get_turf(holder.my_atom) - var/inside_msg - if(ismob(holder.my_atom)) - var/mob/M = holder.my_atom - inside_msg = " inside [ADMIN_LOOKUPFLW(M)]" - var/lastkey = holder.my_atom.fingerprintslast - var/touch_msg = "N/A" - if(lastkey) - var/mob/toucher = get_mob_by_key(lastkey) - touch_msg = "[ADMIN_LOOKUPFLW(toucher)]" - message_admins("Reagent explosion reaction occurred at [ADMIN_VERBOSEJMP(T)][inside_msg]. Last Fingerprint: [touch_msg].") - log_game("Reagent explosion reaction occurred at [AREACOORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"]." ) - var/datum/effect_system/reagents_explosion/e = new() - e.set_up(modifier + round(created_volume/strengthdiv, 1), T, 0, 0) - e.start() +/datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, created_volume, turf/overrde) + if(!noexplosion) + var/turf/T = override || get_turf(holder.my_atom) + var/inside_msg + if(ismob(holder.my_atom)) + var/mob/M = holder.my_atom + inside_msg = " inside [ADMIN_LOOKUPFLW(M)]" + var/lastkey = holder.my_atom.fingerprintslast + var/touch_msg = "N/A" + if(lastkey) + var/mob/toucher = get_mob_by_key(lastkey) + touch_msg = "[ADMIN_LOOKUPFLW(toucher)]" + message_admins("Reagent explosion reaction occurred at [ADMIN_VERBOSEJMP(T)][inside_msg]. Last Fingerprint: [touch_msg].") + log_game("Reagent explosion reaction occurred at [AREACOORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"]." ) + var/datum/effect_system/reagents_explosion/e = new() + e.set_up(modifier + round(created_volume/strengthdiv, 1), T, 0, 0) + e.start() holder.clear_reagents() @@ -56,6 +58,7 @@ required_reagents = list("holywater" = 1, "potassium" = 1) /datum/chemical_reaction/reagent_explosion/potassium_explosion/holyboom/on_reaction(datum/reagents/holder, created_volume) + var/turf/T = get_turf(holder.my_atom) if(created_volume >= 150) playsound(get_turf(holder.my_atom), 'sound/effects/pray.ogg', 80, 0, round(created_volume/48)) strengthdiv = 8 @@ -76,7 +79,7 @@ C.Knockdown(40) C.adjust_fire_stacks(5) C.IgniteMob() - ..() + ..(holder, created_volume, T) /datum/chemical_reaction/blackpowder @@ -95,8 +98,9 @@ mix_message = "Sparks start flying around the black powder!" /datum/chemical_reaction/reagent_explosion/blackpowder_explosion/on_reaction(datum/reagents/holder, created_volume) + var/turf/T = get_turf(holder.my_atom) sleep(rand(50,100)) - ..() + ..(holder, created_volume, T) /datum/chemical_reaction/thermite name = "Thermite" @@ -423,6 +427,7 @@ required_reagents = list("teslium" = 1, "water" = 1) strengthdiv = 100 modifier = -100 + noexplosion = TRUE mix_message = "The teslium starts to spark as electricity arcs away from it!" mix_sound = 'sound/machines/defib_zap.ogg' var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN From e9558d1b1753937cc9508ea58f1bf104d56e2ec7 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 23 Mar 2019 12:38:23 -0700 Subject: [PATCH 075/142] Update pyrotechnics.dm --- code/modules/reagents/chemistry/recipes/pyrotechnics.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index eec94c7b35..29863c2b90 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -5,7 +5,7 @@ var/modifier = 0 var/noexplosion = FALSE -/datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, created_volume, turf/overrde) +/datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, created_volume, turf/override) if(!noexplosion) var/turf/T = override || get_turf(holder.my_atom) var/inside_msg From fb615dbb07861e53c1ee7fb635bdf178298d3f6c Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 24 Mar 2019 01:10:25 -0400 Subject: [PATCH 076/142] fUCKING CULTCODE --- code/modules/antagonists/cult/runes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index f3975851ca..8a3f81fc01 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -112,7 +112,7 @@ structure_check() searches for nearby cultist structures required for the invoca var/list/invokers = list() //people eligible to invoke the rune if(user) invokers += user - if(req_cultists > 1 || istype(src, /obj/effect/rune/convert)) + if(req_cultists > 1 || istype(src, /obj/effect/rune/narsie) || istype(src, /obj/effect/rune/convert)) var/list/things_in_range = range(1, src) var/obj/item/toy/plush/narplush/plushsie = locate() in things_in_range if(istype(plushsie) && plushsie.is_invoker) From 583bfdc66ae51dd26adeb08833c8fdeb1ab71a48 Mon Sep 17 00:00:00 2001 From: BlackMajor Date: Sun, 24 Mar 2019 23:34:49 +1300 Subject: [PATCH 077/142] Ling HUD icons Adds a shit load of HUD icons for changeling actions. --- code/datums/mind.dm | 5 +++++ .../changeling/cellular_emporium.dm | 2 +- .../changeling/changeling_power.dm | 2 ++ .../antagonists/changeling/powers/absorb.dm | 3 +++ .../changeling/powers/adrenaline.dm | 3 +++ .../changeling/powers/augmented_eyesight.dm | 5 +++++ .../changeling/powers/biodegrade.dm | 3 +++ .../changeling/powers/chameleon_skin.dm | 4 ++++ .../changeling/powers/digitalcamo.dm | 4 ++++ .../changeling/powers/fakedeath.dm | 7 +++++- .../changeling/powers/fleshmend.dm | 3 +++ .../antagonists/changeling/powers/headcrab.dm | 3 +++ .../antagonists/changeling/powers/hivemind.dm | 19 ++++++++++++++++ .../changeling/powers/humanform.dm | 3 +++ .../changeling/powers/lesserform.dm | 3 +++ .../antagonists/changeling/powers/linglink.dm | 3 +++ .../changeling/powers/mimic_voice.dm | 3 +++ .../changeling/powers/mutations.dm | 17 ++++++++++++++ .../antagonists/changeling/powers/panacea.dm | 3 +++ .../changeling/powers/pheromone_receptors.dm | 3 +++ .../changeling/powers/regenerate.dm | 3 +++ .../antagonists/changeling/powers/revive.dm | 4 ++++ .../antagonists/changeling/powers/shriek.dm | 6 +++++ .../antagonists/changeling/powers/spiders.dm | 3 +++ .../changeling/powers/strained_muscles.dm | 3 +++ .../changeling/powers/tiny_prick.dm | 21 ++++++++++++++++++ .../changeling/powers/transform.dm | 3 +++ code/modules/mob/transform_procs.dm | 9 +++++--- icons/mob/actions/actions_changeling.dmi | Bin 0 -> 22156 bytes icons/mob/actions/backgrounds.dmi | Bin 5866 -> 6011 bytes 30 files changed, 145 insertions(+), 5 deletions(-) create mode 100644 icons/mob/actions/actions_changeling.dmi diff --git a/code/datums/mind.dm b/code/datums/mind.dm index d467d8fd9d..741822d546 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -752,6 +752,11 @@ for(var/X in spell_list) var/obj/effect/proc_holder/spell/S = X S.action.Grant(new_character) + var/datum/antagonist/changeling/changeling = new_character.mind.has_antag_datum(/datum/antagonist/changeling) + if(changeling) + for(var/P in changeling.purchasedpowers) + var/obj/effect/proc_holder/changeling/I = P + I.action.Grant(new_character) /datum/mind/proc/disrupt_spells(delay, list/exceptions = New()) for(var/X in spell_list) diff --git a/code/modules/antagonists/changeling/cellular_emporium.dm b/code/modules/antagonists/changeling/cellular_emporium.dm index 2a37a3885d..3cf0a3ee25 100644 --- a/code/modules/antagonists/changeling/cellular_emporium.dm +++ b/code/modules/antagonists/changeling/cellular_emporium.dm @@ -72,7 +72,7 @@ name = "Cellular Emporium" icon_icon = 'icons/obj/drinks.dmi' button_icon_state = "changelingsting" - background_icon_state = "bg_alien" + background_icon_state = "bg_ling" var/datum/cellular_emporium/cellular_emporium /datum/action/innate/cellular_emporium/New(our_target) diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm index c89dc50cec..1d4f15ec9d 100644 --- a/code/modules/antagonists/changeling/changeling_power.dm +++ b/code/modules/antagonists/changeling/changeling_power.dm @@ -20,10 +20,12 @@ /obj/effect/proc_holder/changeling/proc/on_purchase(mob/user, is_respec) + action.Grant(user) if(!is_respec) SSblackbox.record_feedback("tally", "changeling_power_purchase", 1, name) /obj/effect/proc_holder/changeling/proc/on_refund(mob/user) + action.Remove(user) return /obj/effect/proc_holder/changeling/Click() diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 2f8fc6943f..34a8231960 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -4,6 +4,9 @@ chemical_cost = 0 dna_cost = 0 req_human = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_absorb_dna" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/absorbDNA/can_sting(mob/living/carbon/user) if(!..()) diff --git a/code/modules/antagonists/changeling/powers/adrenaline.dm b/code/modules/antagonists/changeling/powers/adrenaline.dm index 34d6e3605b..ede14a23c9 100644 --- a/code/modules/antagonists/changeling/powers/adrenaline.dm +++ b/code/modules/antagonists/changeling/powers/adrenaline.dm @@ -6,6 +6,9 @@ dna_cost = 2 req_human = 1 req_stat = UNCONSCIOUS + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_adrenals" + action_background_icon_state = "bg_ling" //Recover from stuns. /obj/effect/proc_holder/changeling/adrenaline/sting_action(mob/living/user) diff --git a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm index 5ec5440a2b..6eafeda63f 100644 --- a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm +++ b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm @@ -8,12 +8,16 @@ chemical_cost = 0 dna_cost = 2 //Would be 1 without thermal vision active = FALSE + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_augmented_eyesight" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/augmented_eyesight/on_purchase(mob/user) //The ability starts inactive, so we should be protected from flashes. var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) if (E) E.flash_protect = 2 //Adjust the user's eyes' flash protection to_chat(user, "We adjust our eyes to protect them from bright lights.") + action.Grant(user) else to_chat(user, "We can't adjust our eyes if we don't have any!") @@ -42,6 +46,7 @@ /obj/effect/proc_holder/changeling/augmented_eyesight/on_refund(mob/user) //Get rid of X-ray vision and flash protection when the user refunds this ability + action.Remove(user) var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) if(E) if (active) diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index d1a2cc3891..f58b90d8e6 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -6,6 +6,9 @@ loudness = 1 dna_cost = 2 req_human = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_freedom" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/biodegrade/sting_action(mob/living/carbon/human/user) var/used = FALSE // only one form of shackles removed per use diff --git a/code/modules/antagonists/changeling/powers/chameleon_skin.dm b/code/modules/antagonists/changeling/powers/chameleon_skin.dm index 3be5103105..b7545353b2 100644 --- a/code/modules/antagonists/changeling/powers/chameleon_skin.dm +++ b/code/modules/antagonists/changeling/powers/chameleon_skin.dm @@ -5,6 +5,9 @@ dna_cost = 2 chemical_cost = 25 req_human = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_camouflage" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/chameleon_skin/sting_action(mob/user) var/mob/living/carbon/human/H = user //SHOULD always be human, because req_human = 1 @@ -18,6 +21,7 @@ return TRUE /obj/effect/proc_holder/changeling/chameleon_skin/on_refund(mob/user) + action.Remove(user) if(user.has_dna()) var/mob/living/carbon/C = user var/datum/mutation/human/HM = GLOB.mutations_list[CHAMELEON] diff --git a/code/modules/antagonists/changeling/powers/digitalcamo.dm b/code/modules/antagonists/changeling/powers/digitalcamo.dm index e8bad0e215..6a0f78b532 100644 --- a/code/modules/antagonists/changeling/powers/digitalcamo.dm +++ b/code/modules/antagonists/changeling/powers/digitalcamo.dm @@ -4,6 +4,9 @@ helptext = "We cannot be tracked by camera or seen by AI units while using this skill. However, humans looking at us will find us... uncanny. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat." dna_cost = 1 loudness = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_digital_camo" + action_background_icon_state = "bg_ling" //Prevents AIs tracking you but makes you easily detectable to the human-eye. /obj/effect/proc_holder/changeling/digitalcamo/sting_action(mob/user) @@ -19,5 +22,6 @@ return TRUE /obj/effect/proc_holder/changeling/digitalcamo/on_refund(mob/user) + action.Remove(user) user.digitalcamo = 0 user.digitalinvis = 0 \ No newline at end of file diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index 753d858cef..41438bcebd 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -6,6 +6,9 @@ req_dna = 1 req_stat = DEAD ignores_fakedeath = TRUE + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_regenerative_stasis" + action_background_icon_state = "bg_ling" //Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay. /obj/effect/proc_holder/changeling/fakedeath/sting_action(mob/living/user) @@ -25,7 +28,9 @@ var/datum/antagonist/changeling/C = user.mind.has_antag_datum(/datum/antagonist/changeling) if(C && C.purchasedpowers) to_chat(user, "We are ready to revive.") - C.purchasedpowers += new /obj/effect/proc_holder/changeling/revive(null) + var/obj/effect/proc_holder/changeling/revive/RV = new /obj/effect/proc_holder/changeling/revive(null) + C.purchasedpowers += RV + RV.action.Grant(user) /obj/effect/proc_holder/changeling/fakedeath/can_sting(mob/living/user) if(user.has_trait(TRAIT_DEATHCOMA, "changeling")) diff --git a/code/modules/antagonists/changeling/powers/fleshmend.dm b/code/modules/antagonists/changeling/powers/fleshmend.dm index 930b756b65..9672d79ee4 100644 --- a/code/modules/antagonists/changeling/powers/fleshmend.dm +++ b/code/modules/antagonists/changeling/powers/fleshmend.dm @@ -5,6 +5,9 @@ chemical_cost = 20 dna_cost = 2 req_stat = UNCONSCIOUS + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_fleshmend" + action_background_icon_state = "bg_ling" //Starts healing you every second for 10 seconds. //Can be used whilst unconscious. diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index 8a932dbd62..72d8a127ab 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -6,6 +6,9 @@ dna_cost = 1 loudness = 2 req_human = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_explode" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/headcrab/sting_action(mob/user) set waitfor = FALSE diff --git a/code/modules/antagonists/changeling/powers/hivemind.dm b/code/modules/antagonists/changeling/powers/hivemind.dm index 86926f51a9..b72123da6f 100644 --- a/code/modules/antagonists/changeling/powers/hivemind.dm +++ b/code/modules/antagonists/changeling/powers/hivemind.dm @@ -5,6 +5,16 @@ helptext = "We will be able to talk with other changelings with :g. Exchanged DNA do not count towards absorb objectives." dna_cost = 1 chemical_cost = -1 + action_icon = 'icons/mob/actions/actions_xeno.dmi' + action_icon_state = "alien_whisper" + action_background_icon_state = "bg_ling" + +/obj/effect/proc_holder/changeling/hivemind_comms/sting_action(var/mob/living/user) + if (user.has_trait(CHANGELING_HIVEMIND_MUTE)) + to_chat(user, "The poison in the air hinders our ability to interact with the hivemind.") + return + var/input = stripped_input(usr, "Please choose a message to transmit.", "Changeling Hivemind", "") + user.say(".g[input]") /obj/effect/proc_holder/changeling/hivemind_comms/on_purchase(mob/user, is_respec) ..() @@ -14,12 +24,15 @@ var/obj/effect/proc_holder/changeling/hivemind_upload/S1 = new if(!changeling.has_sting(S1)) changeling.purchasedpowers+=S1 + S1.action.Grant(user) var/obj/effect/proc_holder/changeling/hivemind_download/S2 = new if(!changeling.has_sting(S2)) changeling.purchasedpowers+=S2 + S2.action.Grant(user) var/obj/effect/proc_holder/changeling/linglink/S3 = new if(!changeling.has_sting(S3)) changeling.purchasedpowers+=S3 + S3.action.Grant(user) // HIVE MIND UPLOAD/DOWNLOAD DNA GLOBAL_LIST_EMPTY(hivemind_bank) @@ -29,6 +42,9 @@ GLOBAL_LIST_EMPTY(hivemind_bank) desc = "Allows us to channel DNA in the airwaves to allow other changelings to absorb it." chemical_cost = 10 dna_cost = -1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_upload" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/hivemind_upload/sting_action(var/mob/living/user) if (user.has_trait(CHANGELING_HIVEMIND_MUTE)) @@ -63,6 +79,9 @@ GLOBAL_LIST_EMPTY(hivemind_bank) desc = "Allows us to absorb DNA that has been channeled to the airwaves. Does not count towards absorb objectives." chemical_cost = 10 dna_cost = -1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_download" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/hivemind_download/can_sting(mob/living/carbon/user) if(!..()) diff --git a/code/modules/antagonists/changeling/powers/humanform.dm b/code/modules/antagonists/changeling/powers/humanform.dm index e04f00308f..a6f7b0b6e9 100644 --- a/code/modules/antagonists/changeling/powers/humanform.dm +++ b/code/modules/antagonists/changeling/powers/humanform.dm @@ -3,6 +3,9 @@ desc = "We change into a human." chemical_cost = 5 req_dna = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_human" + action_background_icon_state = "bg_ling" //Transform into a human. /obj/effect/proc_holder/changeling/humanform/sting_action(mob/living/carbon/user) diff --git a/code/modules/antagonists/changeling/powers/lesserform.dm b/code/modules/antagonists/changeling/powers/lesserform.dm index 24403b406c..1f9ca0b3ff 100644 --- a/code/modules/antagonists/changeling/powers/lesserform.dm +++ b/code/modules/antagonists/changeling/powers/lesserform.dm @@ -5,6 +5,9 @@ dna_cost = 1 loudness = 2 req_human = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_lesser" + action_background_icon_state = "bg_ling" //Transform into a monkey. /obj/effect/proc_holder/changeling/lesserform/sting_action(mob/living/carbon/human/user) diff --git a/code/modules/antagonists/changeling/powers/linglink.dm b/code/modules/antagonists/changeling/powers/linglink.dm index baa02ea7c8..70df78e3b4 100644 --- a/code/modules/antagonists/changeling/powers/linglink.dm +++ b/code/modules/antagonists/changeling/powers/linglink.dm @@ -4,6 +4,9 @@ chemical_cost = 0 dna_cost = -1 req_human = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_link" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/linglink/can_sting(mob/living/carbon/user) if(!..()) diff --git a/code/modules/antagonists/changeling/powers/mimic_voice.dm b/code/modules/antagonists/changeling/powers/mimic_voice.dm index 6808ecd61a..170aea1e9c 100644 --- a/code/modules/antagonists/changeling/powers/mimic_voice.dm +++ b/code/modules/antagonists/changeling/powers/mimic_voice.dm @@ -5,6 +5,9 @@ chemical_cost = 0 //constant chemical drain hardcoded dna_cost = 1 req_human = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_mimic_voice" + action_background_icon_state = "bg_ling" // Fake Voice diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 9e353a1855..3d6c766307 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -56,6 +56,7 @@ return W /obj/effect/proc_holder/changeling/weapon/on_refund(mob/user) + action.Remove(user) for(var/obj/item/I in user.held_items) check_weapon(user, I) @@ -105,6 +106,7 @@ /obj/effect/proc_holder/changeling/suit/on_refund(mob/user) if(!ishuman(user)) return + action.Remove(user) var/mob/living/carbon/human/H = user check_suit(H) @@ -141,6 +143,9 @@ req_human = 1 weapon_type = /obj/item/melee/arm_blade weapon_name_simple = "blade" + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_armblade" + action_background_icon_state = "bg_ling" /obj/item/melee/arm_blade name = "arm blade" @@ -225,6 +230,9 @@ weapon_type = /obj/item/gun/magic/tentacle weapon_name_simple = "tentacle" silent = TRUE + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_tentacle" + action_background_icon_state = "bg_ling" /obj/item/gun/magic/tentacle name = "tentacle" @@ -401,6 +409,9 @@ dna_cost = 1 loudness = 1 req_human = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_shield" + action_background_icon_state = "bg_ling" weapon_type = /obj/item/shield/changeling weapon_name_simple = "shield" @@ -454,6 +465,9 @@ dna_cost = 2 loudness = 1 req_human = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_space_suit" + action_background_icon_state = "bg_ling" suit_type = /obj/item/clothing/suit/space/changeling helmet_type = /obj/item/clothing/head/helmet/space/changeling @@ -503,6 +517,9 @@ loudness = 2 req_human = 1 recharge_slowdown = 0.25 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_armor" + action_background_icon_state = "bg_ling" suit_type = /obj/item/clothing/suit/armor/changeling helmet_type = /obj/item/clothing/head/helmet/changeling diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index cb5aba6c99..9f7a36f214 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -5,6 +5,9 @@ chemical_cost = 20 dna_cost = 1 req_stat = UNCONSCIOUS + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_anatomic_panacea" + action_background_icon_state = "bg_ling" //Heals the things that the other regenerative abilities don't. /obj/effect/proc_holder/changeling/panacea/sting_action(mob/user) diff --git a/code/modules/antagonists/changeling/powers/pheromone_receptors.dm b/code/modules/antagonists/changeling/powers/pheromone_receptors.dm index c3fe3c9bc0..4995b27807 100644 --- a/code/modules/antagonists/changeling/powers/pheromone_receptors.dm +++ b/code/modules/antagonists/changeling/powers/pheromone_receptors.dm @@ -10,6 +10,9 @@ chemical_cost = 0 //Reduces regain rate while active. dna_cost = 2 var/receptors_active = FALSE + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_pheromone" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/pheromone_receptors/sting_action(mob/living/carbon/user) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) diff --git a/code/modules/antagonists/changeling/powers/regenerate.dm b/code/modules/antagonists/changeling/powers/regenerate.dm index c86bf271d4..a1f8e1ef9b 100644 --- a/code/modules/antagonists/changeling/powers/regenerate.dm +++ b/code/modules/antagonists/changeling/powers/regenerate.dm @@ -8,6 +8,9 @@ chemical_cost = 10 dna_cost = 0 req_stat = UNCONSCIOUS + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_regenerate" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/regenerate/sting_action(mob/living/user) to_chat(user, "You feel an itching, both inside and \ diff --git a/code/modules/antagonists/changeling/powers/revive.dm b/code/modules/antagonists/changeling/powers/revive.dm index 937748a7ef..514b7603fd 100644 --- a/code/modules/antagonists/changeling/powers/revive.dm +++ b/code/modules/antagonists/changeling/powers/revive.dm @@ -5,6 +5,9 @@ req_stat = DEAD always_keep = TRUE ignores_fakedeath = TRUE + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_revive" + action_background_icon_state = "bg_ling" //Revive from revival stasis /obj/effect/proc_holder/changeling/revive/sting_action(mob/living/carbon/user) @@ -26,6 +29,7 @@ to_chat(user, "We have revived ourselves.") var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) changeling.purchasedpowers -= src + src.action.Remove(user) return TRUE /obj/effect/proc_holder/changeling/revive/can_be_used_by(mob/living/user) diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index f77624d072..65e58ae65b 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -6,6 +6,9 @@ dna_cost = 1 loudness = 1 req_human = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_resonant" + action_background_icon_state = "bg_ling" //A flashy ability, good for crowd control and sewing chaos. /obj/effect/proc_holder/changeling/resonant_shriek/sting_action(mob/user) @@ -36,6 +39,9 @@ chemical_cost = 20 dna_cost = 1 loudness = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_dissonant" + action_background_icon_state = "bg_ling" //A flashy ability, good for crowd control and sewing chaos. /obj/effect/proc_holder/changeling/dissonant_shriek/sting_action(mob/user) diff --git a/code/modules/antagonists/changeling/powers/spiders.dm b/code/modules/antagonists/changeling/powers/spiders.dm index 2bd1bc8a35..489f646b39 100644 --- a/code/modules/antagonists/changeling/powers/spiders.dm +++ b/code/modules/antagonists/changeling/powers/spiders.dm @@ -6,6 +6,9 @@ dna_cost = 1 loudness = 4 req_absorbs = 3 + action_icon = 'icons/effects/effects.dmi' + action_icon_state = "spiderling" + action_background_icon_state = "bg_ling" //Makes some spiderlings. Good for setting traps and causing general trouble. /obj/effect/proc_holder/changeling/spiders/sting_action(mob/user) diff --git a/code/modules/antagonists/changeling/powers/strained_muscles.dm b/code/modules/antagonists/changeling/powers/strained_muscles.dm index 832f6073b6..4e8b8adbd1 100644 --- a/code/modules/antagonists/changeling/powers/strained_muscles.dm +++ b/code/modules/antagonists/changeling/powers/strained_muscles.dm @@ -10,6 +10,9 @@ req_human = 1 var/stacks = 0 //Increments every 5 seconds; damage increases over time active = 0 //Whether or not you are a hedgehog + action_icon = 'icons/obj/implants.dmi' + action_icon_state = "adrenal" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/strained_muscles/sting_action(mob/living/carbon/user) active = !active diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 6c9e0c6599..b9abf76fd1 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -70,6 +70,9 @@ dna_cost = 3 loudness = 1 var/datum/changelingprofile/selected_dna = null + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_sting_transform" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/sting/transformation/Click() var/mob/user = usr @@ -117,6 +120,9 @@ chemical_cost = 20 dna_cost = 1 loudness = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_sting_fake" + action_background_icon_state = "bg_ling" /obj/item/melee/arm_blade/false desc = "A grotesque mass of flesh that used to be your arm. Although it looks dangerous at first, you can tell it's actually quite dull and useless." @@ -169,6 +175,9 @@ sting_icon = "sting_extract" chemical_cost = 25 dna_cost = 0 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_sting_extract" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/sting/extract_dna/can_sting(mob/user, mob/target) if(..()) @@ -190,6 +199,9 @@ chemical_cost = 20 dna_cost = 2 loudness = 2 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_sting_mute" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/sting/mute/sting_action(mob/user, mob/living/carbon/target) log_combat(user, target, "stung", "mute sting") @@ -204,6 +216,9 @@ chemical_cost = 25 dna_cost = 1 loudness = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_sting_blind" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/sting/blind/sting_action(mob/user, mob/living/carbon/target) log_combat(user, target, "stung", "blind sting") @@ -220,6 +235,9 @@ sting_icon = "sting_lsd" chemical_cost = 10 dna_cost = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_sting_lsd" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/sting/LSD/sting_action(mob/user, mob/living/carbon/target) log_combat(user, target, "stung", "LSD sting") @@ -238,6 +256,9 @@ chemical_cost = 15 dna_cost = 2 loudness = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_sting_cryo" + action_background_icon_state = "bg_ling" /obj/effect/proc_holder/changeling/sting/cryo/sting_action(mob/user, mob/target) log_combat(user, target, "stung", "cryo sting") diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index 1e2b22cdae..767c7d2621 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -5,6 +5,9 @@ dna_cost = 0 req_dna = 1 req_human = 1 + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "ling_transform" + action_background_icon_state = "bg_ling" /obj/item/clothing/glasses/changeling name = "flesh" diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 342ee386b6..5703e2190b 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -96,7 +96,9 @@ mind.transfer_to(O) var/datum/antagonist/changeling/changeling = O.mind.has_antag_datum(/datum/antagonist/changeling) if(changeling) - changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null) + var/obj/effect/proc_holder/changeling/humanform/HF = new /obj/effect/proc_holder/changeling/humanform(null) + changeling.purchasedpowers += HF + HF.action.Grant(O) for(var/X in internal_organs) var/obj/item/organ/I = X @@ -129,8 +131,9 @@ mind.transfer_to(O) var/datum/antagonist/changeling/changeling = O.mind.has_antag_datum(/datum/antagonist/changeling) if(changeling) - changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null) - + var/obj/effect/proc_holder/changeling/humanform/HF = new /obj/effect/proc_holder/changeling/humanform(null) + changeling.purchasedpowers += HF + HF.action.Grant(O) if (tr_flags & TR_DEFAULTMSG) to_chat(O, "You are now a monkey.") diff --git a/icons/mob/actions/actions_changeling.dmi b/icons/mob/actions/actions_changeling.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ce6b81e13ba6eaafe99eb8923dd8c1694bb08394 GIT binary patch literal 22156 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 QbN~PV07*qoM6N<$f{9aUAOHXW literal 0 HcmV?d00001 diff --git a/icons/mob/actions/backgrounds.dmi b/icons/mob/actions/backgrounds.dmi index 4303c6fff6ca1f7ecde5dc517ac13b450d5a65ca..82303c5862312d40f2be1fb426a503361e126a5a 100644 GIT binary patch literal 6011 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 DE;OS3 literal 5866 zcmcJTXIK+Kx5pPk??_RkO9Vve61pJONE4|dNbg37^d1nDE{OCF3P`U(5g`InrHf$b zO?pQlB!oBU``i!re!d@e&$DyRo|&DU-+#_-)B{~jTB@s5007WJ@2Nc`SQO#NqaY)k z%>->N2&U8D(9~1S-oy5}v%9CW+cN<0&5BFtqk196pg!JXLenJt{;1}Ak>Ixod{~D} z#t=9KY<7BVL1EEgpVm*qvF)x$H@&)OT_q=FWTMnkF zEx}9Cefojj{cVg6o8t>gMiS<%xVv&wN1{&B0aRPDs#KS`orFo>{^VKnK(Tx|?9h!j z)?~bXL%vL&RJ+7;d@=&O24Y$kFwDr(ih0X~H}s!>s(jOuCvW16Ek|`Mh0t{fDE;)? z8_m~SF9CpM7OHmF&^K!<+u|w5xL4Qt=c7tv=JxCABF;Z;BG9^ano^sd_9)s|!`e)h z4_gX{p$&0n5kkr@sVOM7OWZoG6+ng(m;Q^`8t6K>ZL_ z;$KoWvJV7b@TcBZx zZq;4O)E6;tyulTL$19nZkC9bSxIqLEHgGN2oP+$nfKuC!uGGE#zS+8KA$E33r>&4! z^clTb;;e!P)$;Ld=Q4eWqdFe>7|*cW<`w9>SIdHFoNA(#-sirZ$;84G=GyQzW%b~9 z$4AP&5?VS+C2qD~ZfY&x=Q131*%C!1KVr8hY}N3ejt8ieX7$fY88JK3!SildvZ1HC zhD}XPL*wJ3hPpW$<1e0-rSW*C=j4=LdDx(R#TBe!>uIb@zJ4cqE>o(_NCyNQ6(!i{N|5$t(;;AmxfXu4BIywMoCE> z>&N3rk!B;Tw7+SuFZp?B)$Q~9=-{R9#G%c~jEctrd$@x^>d8{eX2si|%Zf~etbb3X zRqGU`70t1XG85^H%3>u8+TKU>QLl2e78&7HtnZ?WJdPYaeN5iNMoeSj$Y{}5iDIlu*{eXW>%JKuCdw)F_*F*6KzyOG1^1s0= zMD>db2$KJ=n-jSJit#gjQUkmo{jR{3ClxgLIVI5y2uDEqs(^CXw~yOM?tjeR}6BnSxX9FX}BC zFFQHfHGKi3BxV7ZhOfqTvij-i&Mv~QO$C|5-ZNHNl2=-&RzM;hJXFl;sa7L}7kv`q z=JnY*h$}4)?5g$&ShaU|pO*}{_#D|pMb=iCmeHkGbHZgF5m) zU(4(XsrQdomkw$QEk5G?jO?O>vCZ2N71ut|JXU|sR!eBOc;TcbT+_*#jl7xGUldN~ zQgq8KQCmTK)P3u7pSW>(yW;^qqPmr*EumCmAA0EbZRrgWxmjErB#7eNV05pP@7nuR zD!)|AD^nw%B;enoK`26sshRPZx>S)ziLH)U?`CmKUn_=OJT5djg$R z3k@N;Uy<2=gn=QH=vfQ-YqrU7CY|N?8%CFi_jogpJq^n z?UyH)pGjY(y?vGT2mFCxYv^Lh_(pz^+N6_j5HZ>AZbc&{xpDu-WhH0!=8B=Ynf)5_=w`E zr4Vs`+l{%#Ee8kbz0xf+lf=g?C%xT+53dpiSz>Eq)w!~4*>XTvvEO)hs+b>GgySFJ zj%#uw3H_`rZPe((GH~LHXPRG;p7l&(#Bc}UYFZT^?6onW4Dk7b0gaCXP8ZKt)y(}* zwS3p{+dt<`_=V~W`qIouknpX|1-IFj>GP-0p3xl~tmo)TUyW0aM76(d^;<;0Ky|hL z(aE}lE0w^c?lglYgU@mfCxE&YZZRO;CL_#5+dvyR*M(Ef-9c@>ooSGX&B4FnX5~~M zyKTH^>%I55g4L`dWh7>>y>F>8eP0P*;YN&jxSZNkHNIiR)cWDTQNm+~=!!uM>clMt zrGOA2d)0fTglA;P(-P;sYK-?zQ#hXr0LU`qyaEtk^Pf*nmP3+rt+g;jbt^jxz+KJF zSymCS3Fkp)Vvk!{JZ7<*kl3kwMpViRuU&KikT7xaL@Ny95SRlWE`-%LkWBf!0`N7O zd?;Y!v9@Y0>~70;z`4pE?JH&GYAwaI%n0b=*s2p z?^}{0aF!G8Tdy3f=?lGK6*NUr%R~ArqULn8tH;D!vD%H7^E4p8%*v=eFV=aE+|cxh zK38HKMz6|$Y{j8CMKyV)Ibd{sVIG6QJQxuuqa^WFFEeEAlnXi;Ye>sY;%)E5V99n* zztLZy%C<*bFT^pId=ob^kgd@SShCRVDxfZC3|d){Om468r7EqxC&IbmwzK8(=P(sz z^3ruKl>pMau+nRW$#F^C@AKrA3ul0*k^tPq|HR#oy%UXLxku^*|eAvO4?*Zo(j@Qo)~f>2hahXE_&ug;O2bG8W}2Mb9s- z7zF1(sR|&s=^>T6O1mg9SZyDu8|=Ll02TW%$Tc)NWZPB}p*2JGxy0LY#${yDeZp=F zvRW#!{i8hT@>Pl-jw{x!EJsVK9y0#5@;~SR5J=kg`F>#s43}0|C=f15mpq7H>9U{P z3<)+zckXn({^U5zu7Y_*r&vdf;!gbw$BF1?0RCsa|{x zfxP)uJ`6y0b0AA!U#|6OAE1BNkuL)PI1E%3^8Aw?@*({9j22F5-u zg9z5Itbl9-@F&{-ZQd)Q^2K0mgQSWzh24u=K^Xov;Fk{%HlUE*dTK~NnM*7hF@3tJ zfOJ&Ov{rue@lgb0Z?%26vzyJkF_17q<#HbAX8T_x0 z@bf#~jjmve%n8XT{uG$mO<`{vUA;{COE&Fi=yyM0vd$_ixanDckzc}F2y1Ghv|gGl zsM?EYWa_?!o*)CcWB92Tj{)xkv_O-yDq{}#*<*Dz1rTR!LqBhIoTlGaVME4>ZRy0;`=h!IFFo}jtCs@l@4NhWj$RIf zKiYZ}dp0<~Su#?W04EJ1y#zYme(WhL4VR%}*XU-a$+M&BXBTO3B_vvGO5%K-m7e)1!<8#(`6B(han9&v*PQ57giT&_Roc0Fd zhy!sWRm8>T2=4wd^L%-&piMjA=!^c`#@H$iX$y8bgrqe`Y#2D#+uBAn1}oq>W4slLj2 z1Z^q;_X~e2IX%HK>3Fjz#`Vvh+AP-9V2a-bvIpJwKeY3)3p%ZLb$t^^4_!YvSkagt z6ox)d8Eh@#I?e3x#O^vFWd$hHakSjXLvOL1$&1`$vDGh7d`wx*+|o@r1ZBy$|}ISD#} z{8bju??XGF?&?q8PsUtd>)ZC;`;6q@^5;Y=ZJ|@ZlJHBOt9LK?^5yMD=e&!XXIC~B zMTqb*3u_c&*KQML?zUdCI`&)8LmlxCplj#|5gL|x2EGIm%}+4Se867O)pewNJSxDv z$U)g?BXi;9i)&9efb0h6G(Oit?C=m2X^8^%1BpCaLT+6(@SK6~3!qa7XjnfcU#00k z?++kCYaB0PHR9G@DMM`>S@IFF;F<&f1$cCP!!}{8)oW3Ne3|K(-Ire-Jc}j@e&ucn zWSptn5{H3hsxB*cQ40{F;zK!Gw|y0;Cg-gT_e?s~6G_xE#AH&aF4&-%(nmmSaHfer z{NG}`1-`QX=^HFy{wuC8NbyN{I*`tbClp5O0vp~N{Ebe39ns@&TKB-Rbx)l z5VTRGp1J~OvU!;c0!L*Ubu7FE_moAOX4wRgk^F2#>HTDtDx#S5PdJKth7O;Q29B2} zrP?k+!e!Rw=fo?>opV=EI3YfCSQ`U1v1krm;vv4JUwR!Qk zo{$Y8(CeQU?j(D=wL+3PVOYf5nDcdv7-MwD*Ls243Xo8WjDVjCP5B~pmr!2NuxpgK zB*UhB6-3w-dE?FLU^m$oewAnl$~&-VWi9$&i-z(s=afM*u*$~#^60-#k zY1ZPj7HLtHvGv}Mdmjl?mACk1wnRJ#l=tn8XE0{}bl0IJP~W;_c$kUQKtm846jo2q zlEnY5_F{i6RHZLi+VI^;jb}Rv0)U%-mGnDHE00^sXxF=?)OpOyrb(K$1!j91ug|X1 z+sjKpi2(1N8JN0AdrIIj7SIi@gv%oM#z|E2=I6VNd+m2FPggxTqfu?JZ-q5KBA)F; zI$O4IZ}pviIqcQ59q$^yYZw%W3>p^}&N{EYHq}~K$fTte6E!)J247MN+`0B7~{wguJ& zu1d!2O3M5p4rI?>!?e^3yJ%A>y)Y0(H4dle>|9g|-{tecX#?on-xC{#&zx47uk&dU zZpf~|{L?0V+lMD?SpyS+?5#T35oC$@fvzA)L7m5^<{lH%J2#48o~`-lS~rpc@w!N- zA_uCQ8E5G>F%BVj4in>`jQu~ft<~$444w{e4!*imE6&*glt>V~4kZ7h6ZkuMl5FuW zD(z18CN!&S82P{I-*3`qTKK!crCpNtGfHNVSHN-bI1_)Kc_$MChCVR@cl?Dfe1g~S z5(k0zWM;>Rzo@0Xxu_c$Q`;g|(R_^X|h7H+-yO#t|vsagi11W2-ZrMZ-3HBAX;g<{pDVGp(c znJgdl9m=2C432UCB;&uz;a9wsWM%QcgEyTHz@|PbI4nXdS{f3SOXBt;-1IMy;_Cmn zY*$SqIhd4VS}4zViSn2VPb>IqCWiSbA&Cr*ltu)u_&b>Y89L~tEN_Bdgv;FgOBHX? zKjZC7kz^J8*ij`*-SZaQIQek>UgUx9q)*tvTZXdW9ciH(tof$|;NDHlGj|N2vhVi<0gutGbL zuQ{=fCRbdOmFalOCLE|HS^6LufyXm$0fY@+vl8A)Kex1!aZa9VrxYuT`5Hp_c@03- Lb=4|Wtit{S4!Ut# From 0504f2e02ac600eedc3c4eb0e9e7e184c5875f4d Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sun, 24 Mar 2019 10:34:35 -0400 Subject: [PATCH 078/142] Update packs.dm --- code/modules/cargo/packs.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 8c18786aa0..d76edf2e10 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -518,7 +518,7 @@ cost = 3500 contains = list(/obj/item/gun/energy/e_gun/dragnet, /obj/item/gun/energy/e_gun/dragnet) - crate_name = "anit riot net guns crate" + crate_name = "anti riot net guns crate" /datum/supply_pack/security/armory/energy name = "Energy Guns Crate" @@ -553,7 +553,7 @@ /datum/supply_pack/security/armory/fire name = "Incendiary Weapons Crate" - desc = "Burn, baby burn. Contains three incendiary grenades, three plasma canisters, and a flamethrower. Requires Armory access to open." + desc = "Burn, baby burn. Contains three incendiary grenades, three plasma canisters, and a flamethrower. Requires Brige access to open." cost = 1500 access = ACCESS_HEADS contains = list(/obj/item/flamethrower/full, @@ -569,12 +569,12 @@ /datum/supply_pack/security/armory/miniguns name = "Personal Miniature Energy Guns" - desc = "Contains three miniature energy guns. Each gun has a dislaber and a lethal option. Requires Armory access to open." + desc = "Contains three miniature energy guns. Each gun has a disabler and a lethal option. Requires Armory access to open." cost = 5000 contains = list(/obj/item/gun/energy/e_gun/mini, /obj/item/gun/energy/e_gun/mini, /obj/item/gun/energy/e_gun/mini) - crate_name = "personal engery guns crate" + crate_name = "personal energy guns crate" crate_type = /obj/structure/closet/crate/secure/plasma /datum/supply_pack/security/armory/laserarmor From b11e3bbc96acd0050f506fe547bfa3e5f310b7ce Mon Sep 17 00:00:00 2001 From: Poojawa Date: Mon, 25 Mar 2019 04:19:00 -0500 Subject: [PATCH 079/142] Vore mode button and feeding --- code/__DEFINES/citadel_defines.dm | 3 ++ code/_onclick/hud/_defines.dm | 1 + code/_onclick/hud/human.dm | 7 +++++ .../code/_onclick/hud/screen_objects.dm | 18 +++++++++++ .../code/modules/mob/living/carbon/carbon.dm | 17 ++++++++++ .../carbon/human/species_types/furrypeople.dm | 2 ++ .../code/modules/vore/eating/living_vr.dm | 26 ++++++++++------ .../code/modules/vore/eating/vore_vr.dm | 5 +++ .../code/modules/vore/eating/vorepanel_vr.dm | 29 +++++++++++++++--- modular_citadel/icons/ui/screen_clockwork.dmi | Bin 3074 -> 3641 bytes modular_citadel/icons/ui/screen_midnight.dmi | Bin 5406 -> 5740 bytes modular_citadel/icons/ui/screen_operative.dmi | Bin 5287 -> 5638 bytes .../icons/ui/screen_plasmafire.dmi | Bin 4769 -> 5141 bytes modular_citadel/icons/ui/screen_slimecore.dmi | Bin 4470 -> 4843 bytes 14 files changed, 94 insertions(+), 14 deletions(-) diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index c7daff49ed..82f38eb092 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -12,6 +12,7 @@ #define ui_boxcraft "EAST-4:22,SOUTH+1:6" #define ui_boxarea "EAST-4:6,SOUTH+1:6" #define ui_boxlang "EAST-5:22,SOUTH+1:6" +#define ui_boxvore "EAST-4:22,SOUTH+1:6" //Filters #define CIT_FILTER_STAMINACRIT filter(type="drop_shadow", x=0, y=0, size=-3, border=0, color="#04080F") @@ -130,5 +131,7 @@ //component stuff #define COMSIG_COMBAT_TOGGLED "combatmode_toggled" //called by combat mode toggle on all equipped items. args: (mob/user, combatmode) +#define COMSIG_VORE_TOGGLED "voremode_toggled" // totally not copypasta + //belly sound pref things #define NORMIE_HEARCHECK 4 diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index b558e7c87c..a987f70d7b 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -85,6 +85,7 @@ #define ui_crafting "EAST-5:20,SOUTH:5"//CIT CHANGE - moves this over one tile to accommodate for combat mode toggle #define ui_building "EAST-5:20,SOUTH:21"//CIT CHANGE - ditto #define ui_language_menu "EAST-5:4,SOUTH:21"//CIT CHANGE - ditto +#define ui_voremode "EAST-5:20,SOUTH:5" #define ui_borg_pull "EAST-2:26,SOUTH+1:7" #define ui_borg_radio "EAST-1:28,SOUTH+1:7" diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 1106bee711..01e118aaed 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -109,6 +109,13 @@ using.screen_loc = ui_boxarea // CIT CHANGE static_inventory += using + using = new /obj/screen/voretoggle() //We fancy Vore now + using.icon = tg_ui_icon_to_cit_ui(ui_style) + using.screen_loc = ui_voremode + if(!widescreenlayout) + using.screen_loc = ui_boxvore + static_inventory += using + action_intent = new /obj/screen/act_intent/segmented action_intent.icon_state = mymob.a_intent static_inventory += action_intent diff --git a/modular_citadel/code/_onclick/hud/screen_objects.dm b/modular_citadel/code/_onclick/hud/screen_objects.dm index 5a193335f3..668abcb3d1 100644 --- a/modular_citadel/code/_onclick/hud/screen_objects.dm +++ b/modular_citadel/code/_onclick/hud/screen_objects.dm @@ -47,3 +47,21 @@ icon_state = "combat" else icon_state = "combat_off" + +/obj/screen/voretoggle + name = "toggle vore mode" + icon = 'modular_citadel/icons/ui/screen_midnight.dmi' + icon_state = "nom_off" + +/obj/screen/voretoggle/Click() + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + C.toggle_vore_mode() + +/obj/screen/voretoggle/proc/rebaseintomygut(mob/living/carbon/C) + if(!C) + return + if(C.voremode) + icon_state = "nom" + else + icon_state = "nom_off" diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm index d52cc6eabb..95ebe54b29 100644 --- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm +++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm @@ -5,6 +5,9 @@ var/lastdirchange var/combatmessagecooldown + //oh no vore time + var/voremode = FALSE + /mob/living/carbon/CanPass(atom/movable/mover, turf/target) . = ..() if(.) @@ -19,6 +22,8 @@ if(recoveringstam) return TRUE combatmode = !combatmode + if(voremode) + toggle_vore_mode() if(combatmode) playsound_local(src, 'modular_citadel/sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay! else @@ -34,6 +39,18 @@ SEND_SIGNAL(src, COMSIG_COMBAT_TOGGLED, src, combatmode) return TRUE +mob/living/carbon/proc/toggle_vore_mode() + if(combatmode) + return FALSE //let's not override the main draw of the game these days + voremode = !voremode + if(client) + client.show_popup_menus = !voremode // it's the RIGHT way to nom. gettit + if(hud_used && hud_used.static_inventory) + for(var/obj/screen/voretoggle/selector in hud_used.static_inventory) + selector.rebaseintomygut(src) + SEND_SIGNAL(src, COMSIG_VORE_TOGGLED, src, voremode) + return TRUE + /mob/living/carbon/Move(atom/newloc, direct = 0) var/currentdirection = dir . = ..() diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index edc36ae3af..c34146a90c 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -233,3 +233,5 @@ /mob/living/carbon/human/vore devourable = TRUE + digestable = TRUE + feeding = TRUE diff --git a/modular_citadel/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm index 74ae0bfe35..45f5667bcb 100644 --- a/modular_citadel/code/modules/vore/eating/living_vr.dm +++ b/modular_citadel/code/modules/vore/eating/living_vr.dm @@ -5,7 +5,7 @@ var/obj/belly/vore_selected // Default to no vore capability. var/list/vore_organs = list() // List of vore containers inside a mob var/devourable = FALSE // Can the mob be vored at all? -// var/feeding = FALSE // Are we going to feed someone else? + var/feeding = FALSE // Are we going to feed someone else? var/vore_taste = null // What the character tastes like var/no_vore = FALSE // If the character/mob can vore. var/openpanel = 0 // Is the vore panel open? @@ -77,13 +77,15 @@ // Critical adjustments due to TG grab changes - Poojawa -/mob/living/proc/vore_attack(var/mob/living/user, var/mob/living/prey) - if(!user || !prey) +/mob/living/proc/vore_attack(var/mob/living/user, var/mob/living/prey, var/mob/living/pred) + if(!user || !prey || !pred) return - if(prey == src && user.zone_selected == "mouth") //you click your target -// if(!feeding(src)) -// return + if(prey == src) //you click your target + if(!src.feeding) + to_chat(user, "They aren't able to be fed.") + to_chat(src, "[user] tried to feed you themselves, but you aren't voracious enough to be fed.") + return if(!is_vore_predator(prey)) to_chat(user, "They aren't voracious enough.") return @@ -96,8 +98,14 @@ user.feed_grabbed_to_self(src, prey) else // click someone other than you/prey -// if(!feeding(src)) -// return + if(!src.feeding) + to_chat(user, "They aren't voracious enough to be fed.") + to_chat(src, "[user] tried to feed you [prey], but you aren't voracious enough to be fed.") + return + if(!prey.feeding) + to_chat(user, "They aren't able to be fed to someone.") + to_chat(prey, "[user] tried to feed you to [src], but you aren't able to be fed to them.") + return if(!is_vore_predator(src)) to_chat(user, "They aren't voracious enough.") return @@ -122,7 +130,7 @@ return perform_the_nom(user, user, pred, belly) /mob/living/proc/feed_grabbed_to_other(var/mob/living/user, var/mob/living/prey, var/mob/living/pred) - return//disabled until I can make that toggle work +// return//disabled until I can make that toggle work var/belly = input("Choose Belly") in pred.vore_organs return perform_the_nom(user, prey, pred, belly) diff --git a/modular_citadel/code/modules/vore/eating/vore_vr.dm b/modular_citadel/code/modules/vore/eating/vore_vr.dm index 32d19fc11b..4cf223c3c4 100644 --- a/modular_citadel/code/modules/vore/eating/vore_vr.dm +++ b/modular_citadel/code/modules/vore/eating/vore_vr.dm @@ -39,6 +39,7 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums) //Actual preferences var/digestable = FALSE var/devourable = FALSE + var/feeding = FALSE // var/allowmobvore = TRUE var/list/belly_prefs = list() var/vore_taste = "nothing in particular" @@ -105,6 +106,7 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums) digestable = json_from_file["digestable"] devourable = json_from_file["devourable"] + feeding = json_from_file["feeding"] vore_taste = json_from_file["vore_taste"] belly_prefs = json_from_file["belly_prefs"] @@ -113,6 +115,8 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums) digestable = FALSE if(isnull(devourable)) devourable = FALSE + if(isnull(feeding)) + feeding = FALSE if(isnull(belly_prefs)) belly_prefs = list() @@ -127,6 +131,7 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums) "version" = version, "digestable" = digestable, "devourable" = devourable, + "feeding" = feeding, "vore_taste" = vore_taste, "belly_prefs" = belly_prefs, ) diff --git a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm index 3d20526a5c..2125e6f0cb 100644 --- a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm +++ b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm @@ -110,7 +110,7 @@ if(DM_DIGEST) spanstyle = "color:red;" if(DM_HEAL) - spanstyle = "color:green;" + spanstyle = "color:darkgreen;" if(DM_NOISY) spanstyle = "color:purple;" if(DM_ABSORB) @@ -238,15 +238,21 @@ dat += "
    " switch(user.digestable) if(TRUE) - dat += "Toggle Digestable (Currently: ON)" + dat += "Toggle Digestable (Currently: ON)" if(FALSE) - dat += "Toggle Digestable (Currently: OFF)" + dat += "Toggle Digestable (Currently: OFF)" switch(user.devourable) if(TRUE) - dat += "Toggle Devourable (Currently: ON)" + dat += "
    Toggle Devourable (Currently: ON)" if(FALSE) - dat += "Toggle Devourable (Currently: OFF)" + dat += "
    Toggle Devourable (Currently: OFF)" + + switch(user.feeding) + if(TRUE) + dat += "
    Toggle Feeding (Currently: ON)" + if(FALSE) + dat += "
    Toggle Feeding (Currently: OFF)" //Returns the dat html to the vore_look return dat @@ -708,5 +714,18 @@ if(user.client.prefs_vr) user.client.prefs_vr.devourable = user.devourable + if(href_list["toggledfeed"]) + var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [user.feeding ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding") + switch(choice) + if("Cancel") + return + if("Allow Feeding") + user.feeding = TRUE + if("Prevent Feeding") + user.feeding = FALSE + + if(user.client.prefs_vr) + user.client.prefs_vr.feeding = user.feeding + //Refresh when interacted with, returning 1 makes vore_look.Topic update return 1 \ No newline at end of file diff --git a/modular_citadel/icons/ui/screen_clockwork.dmi b/modular_citadel/icons/ui/screen_clockwork.dmi index 499d2663b6c60590f8baeba0c18835cf7459760d..2b70d37f1e812de2df0e59f96c509ca95e517299 100644 GIT binary patch literal 3641 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 GDdvCWQ!{P= literal 3074 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 CSpQ%E diff --git a/modular_citadel/icons/ui/screen_midnight.dmi b/modular_citadel/icons/ui/screen_midnight.dmi index 38d96b86d1564fffe07da6fb46ec6dbf3f9bddfb..396fd4a36ef241530322fb1660cdac416739c62d 100644 GIT binary patch literal 5740 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 ZPKrbH7g!<@Pyc)X4Ha$WdL>BM{{R^}^#%X{ literal 4769 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 RL%aY0002ovPDHLkV1hwYP4xf( literal 4470 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 Date: Mon, 25 Mar 2019 04:32:27 -0500 Subject: [PATCH 080/142] Properly account for tauric mode --- code/modules/clothing/spacesuits/hardsuit.dm | 2 +- code/modules/clothing/suits/_suits.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 44916aa6af..c061d756b7 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -712,7 +712,7 @@ /obj/item/clothing/suit/space/hardsuit/shielded/worn_overlays(isinhands) . = list() if(!isinhands) - if(tauric == TRUE) + if(taurmode >= SNEK_TAURIC) . += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', shield_state, MOB_LAYER + 0.01) else . += mutable_appearance('icons/effects/effects.dmi', shield_state, MOB_LAYER + 0.01) diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index 93c15743e8..054154639c 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -61,7 +61,7 @@ if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]") IF_HAS_BLOOD_DNA(src) - if(tauric == TRUE) + if(taurmode >= SNEK_TAURIC) . += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "[blood_overlay_type]blood") else . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood") From da949a597ff28a6fa3afc0fd436d77481225ddc4 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Mon, 25 Mar 2019 16:32:02 -0400 Subject: [PATCH 081/142] Maybe! --- .../objects/items/robot/robot_upgrades.dm | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 38cfdb95ae..bd42139168 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -504,6 +504,32 @@ var/obj/item/surgical_processor/SP = locate() in R.module R.module.remove_module(SP, TRUE) +/obj/item/borg/upgrade/advhealth + name = "advanced cyborg health scanner" + desc = "An upgrade to the Medical modules, installing a built-in \ + advanced health scanner, for better readings on patients." + icon_state = "cyborg_upgrade3" + require_module = 1 + module_type list=( + /obj/item/robot_module/medical, + /obj/item/robot_module/standerd, + /obj/item/robot_module/syndicate_medical, + /obj/item/robot_module/medihound, + /obj/item/robot_module/borgi) + +/obj/item/borg/upgrade/advhealth/action(mob/living/silicon/robot/R, user = usr) + . = ..() + if(.) + var/obj/item/healthanalyzer/advanced/AH = new(R.module) + R.module.basic_modules += AH + R.module.add_module(AH, FALSE, TRUE) + +/obj/item/borg/upgrade/processor/deactivate(mob/living/silicon/robot/R, user = usr) + . = ..() + if (.) + var/obj/item/healthanalyzer/advanced/AH = locate() in R.module + R.module.remove_module(AH, TRUE) + /obj/item/borg/upgrade/ai name = "B.O.R.I.S. module" desc = "Bluespace Optimized Remote Intelligence Synchronization. An uplink device which takes the place of an MMI in cyborg endoskeletons, creating a robotic shell controlled by an AI." @@ -638,4 +664,4 @@ name = "borg module picker (Clown)" desc = "Allows you to to turn a cyborg into a clown, honk." icon_state = "cyborg_upgrade3" - new_module = /obj/item/robot_module/clown \ No newline at end of file + new_module = /obj/item/robot_module/clown From 3feb70e1df05129ce26b1812cccd344d819debbf Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Mon, 25 Mar 2019 16:38:10 -0400 Subject: [PATCH 082/142] Update mechfabricator_designs.dm --- code/modules/research/designs/mechfabricator_designs.dm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 97c769170d..e8c8bab09f 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -768,6 +768,15 @@ construction_time = 120 category = list("Cyborg Upgrade Modules") +/datum/design/borg_upgrade_advhealth + name = "Cyborg Upgrade (Advance Health Scanner)" + id = "borg_upgrade_advhealth" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/advhealth + materials = list(MAT_METAL=7500, MAT_GLASS=7500, MAT_SILVER=1000, MAT_GOLD=1000, MAT_TITANIUM=2000) + construction_time = 100 + category = list("Cyborg Upgrade Modules") + //Misc /datum/design/mecha_tracking name = "Exosuit Tracking Beacon" From 8752fd56da75faaef1e563fd7012f5f391a18369 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Mon, 25 Mar 2019 16:39:47 -0400 Subject: [PATCH 083/142] Update all_nodes.dm --- code/modules/research/techweb/all_nodes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index e7bbd468dc..2a66ba2aee 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -309,7 +309,7 @@ display_name = "Cyborg Upgrades: Medical" description = "Medical upgrades for cyborgs." prereq_ids = list("adv_biotech", "robotics") - design_ids = list("borg_upgrade_defibrillator", "borg_upgrade_piercinghypospray", "borg_upgrade_highstrengthsynthesiser", "borg_upgrade_expandedsynthesiser", "borg_upgrade_pinpointer", "borg_upgrade_surgicalprocessor") + design_ids = list("borg_upgrade_defibrillator", "borg_upgrade_advhealth", "borg_upgrade_piercinghypospray", "borg_upgrade_highstrengthsynthesiser", "borg_upgrade_expandedsynthesiser", "borg_upgrade_pinpointer", "borg_upgrade_surgicalprocessor") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) export_price = 5000 From 823299acb9a447243edb67edecb4d2411c547e58 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Mon, 25 Mar 2019 17:05:36 -0400 Subject: [PATCH 084/142] Not as broken code as I thought --- code/game/objects/items/robot/robot_upgrades.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index bd42139168..d5806494e6 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -510,9 +510,8 @@ advanced health scanner, for better readings on patients." icon_state = "cyborg_upgrade3" require_module = 1 - module_type list=( + module_type = list( /obj/item/robot_module/medical, - /obj/item/robot_module/standerd, /obj/item/robot_module/syndicate_medical, /obj/item/robot_module/medihound, /obj/item/robot_module/borgi) From f3c3f9cd1283815ebce2380eb2ebeebc57dbc15d Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 25 Mar 2019 21:30:23 -0400 Subject: [PATCH 085/142] why the fuck was this a hidden verb - makes succumb available in the IC tab --- code/modules/mob/living/living.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 0e67ce7510..b9b6424092 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -312,7 +312,8 @@ return TRUE /mob/living/verb/succumb(whispered as null) - set hidden = TRUE + set name = "Succumb" + set category = "IC" if (InCritical()) log_message("Has [whispered ? "whispered his final words" : "succumbed to death"] while in [InFullCritical() ? "hard":"soft"] critical with [round(health, 0.1)] points of health!", LOG_ATTACK) adjustOxyLoss(health - HEALTH_THRESHOLD_DEAD) From d231c7d1c5aedf86f264f81074e7337e1e711809 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Tue, 26 Mar 2019 21:10:18 -0400 Subject: [PATCH 086/142] Delete drink.dmi --- modular_citadel/icons/obj/food/drink.dmi | Bin 423 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 modular_citadel/icons/obj/food/drink.dmi diff --git a/modular_citadel/icons/obj/food/drink.dmi b/modular_citadel/icons/obj/food/drink.dmi deleted file mode 100644 index 0972025b4f4272db44645bb3e7ff4881bc678164..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 423 zcmV;Y0a*TtP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5sUR~iJ2x{YTZxM^C9|j)C}haRnO2mTn+jp0C@e`$#HCJI!PU;eD Date: Tue, 26 Mar 2019 21:10:33 -0400 Subject: [PATCH 087/142] Delete drinks.dmi --- modular_citadel/icons/obj/drinks.dmi | Bin 347 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 modular_citadel/icons/obj/drinks.dmi diff --git a/modular_citadel/icons/obj/drinks.dmi b/modular_citadel/icons/obj/drinks.dmi deleted file mode 100644 index 0000af8b56ab2556a84c5eb1c2f942e9b28febf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQv3lvA+84w9B620`2YVuPymRR zU3>lt$YLxB@(X5gcy=QV$SJJ~i70VNElw`VEGWs$&tqVym=hdUP*nQ;OK`!*uTQkR zb+yi&IUl?s)Zn7=gGV~&eKb!p6!rA(urLlXzHIEJFz3;vBa=cDf>&A?TAOO_U!tNO z+SzTax_O0!M#hPwGsC9Ln9Y^ASi@IO_rOxW$b(nUv%X Date: Tue, 26 Mar 2019 21:10:59 -0400 Subject: [PATCH 088/142] Add files via upload --- modular_citadel/icons/obj/drinks.dmi | Bin 0 -> 547 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 modular_citadel/icons/obj/drinks.dmi diff --git a/modular_citadel/icons/obj/drinks.dmi b/modular_citadel/icons/obj/drinks.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a7af4f23bdc54b028200bd6914fa0017f7d2a371 GIT binary patch literal 547 zcmV+;0^I$HP)4DS$#Itc?{_A^nx2nJXsope&a5$LO3M?iV zqldpxm{_afhUncG$n&fkk;om7wHa-UKzEc{ZYy*rt~X6UhK?A>%TWW_0(7FhbP6bE z00@Bj`cea;DD)2a%D|Jz Date: Tue, 26 Mar 2019 22:32:11 -0400 Subject: [PATCH 089/142] Attempts to optimize the lighting process by ditching the inverse-square falloff algorithm in favor of a linear one --- code/modules/lighting/lighting_source.dm | 604 ++++++++++++----------- 1 file changed, 306 insertions(+), 298 deletions(-) diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index 59ce11baeb..bde0a61be5 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -1,298 +1,306 @@ -// This is where the fun begins. -// These are the main datums that emit light. - -/datum/light_source - var/atom/top_atom // The atom we're emitting light from (for example a mob if we're from a flashlight that's being held). - var/atom/source_atom // The atom that we belong to. - - var/turf/source_turf // The turf under the above. - var/turf/pixel_turf // The turf the top_atom appears to over. - var/light_power // Intensity of the emitter light. - var/light_range // The range of the emitted light. - var/light_color // The colour of the light, string, decomposed by parse_light_color() - - // Variables for keeping track of the colour. - var/lum_r - var/lum_g - var/lum_b - - // The lumcount values used to apply the light. - var/tmp/applied_lum_r - var/tmp/applied_lum_g - var/tmp/applied_lum_b - - var/list/datum/lighting_corner/effect_str // List used to store how much we're affecting corners. - var/list/turf/affecting_turfs - - var/applied = FALSE // Whether we have applied our light yet or not. - - var/needs_update = LIGHTING_NO_UPDATE // Whether we are queued for an update. - - -/datum/light_source/New(var/atom/owner, var/atom/top) - source_atom = owner // Set our new owner. - LAZYADD(source_atom.light_sources, src) - top_atom = top - if (top_atom != source_atom) - LAZYADD(top_atom.light_sources, src) - - source_turf = top_atom - pixel_turf = get_turf_pixel(top_atom) || source_turf - - light_power = source_atom.light_power - light_range = source_atom.light_range - light_color = source_atom.light_color - - parse_light_color() - - update() - - return ..() - -/datum/light_source/Destroy(force) - remove_lum() - if (source_atom) - LAZYREMOVE(source_atom.light_sources, src) - - if (top_atom) - LAZYREMOVE(top_atom.light_sources, src) - - if (needs_update) - GLOB.lighting_update_lights -= src - - . = ..() - -// Yes this doesn't align correctly on anything other than 4 width tabs. -// If you want it to go switch everybody to elastic tab stops. -// Actually that'd be great if you could! -#define EFFECT_UPDATE(level) \ - if (needs_update == LIGHTING_NO_UPDATE) \ - GLOB.lighting_update_lights += src; \ - if (needs_update < level) \ - needs_update = level; \ - - -// This proc will cause the light source to update the top atom, and add itself to the update queue. -/datum/light_source/proc/update(var/atom/new_top_atom) - // This top atom is different. - if (new_top_atom && new_top_atom != top_atom) - if(top_atom != source_atom && top_atom.light_sources) // Remove ourselves from the light sources of that top atom. - LAZYREMOVE(top_atom.light_sources, src) - - top_atom = new_top_atom - - if (top_atom != source_atom) - LAZYADD(top_atom.light_sources, src) // Add ourselves to the light sources of our new top atom. - - EFFECT_UPDATE(LIGHTING_CHECK_UPDATE) - -// Will force an update without checking if it's actually needed. -/datum/light_source/proc/force_update() - EFFECT_UPDATE(LIGHTING_FORCE_UPDATE) - -// Will cause the light source to recalculate turfs that were removed or added to visibility only. -/datum/light_source/proc/vis_update() - EFFECT_UPDATE(LIGHTING_VIS_UPDATE) - -// Decompile the hexadecimal colour into lumcounts of each perspective. -/datum/light_source/proc/parse_light_color() - if (light_color) - lum_r = GetRedPart (light_color) / 255 - lum_g = GetGreenPart (light_color) / 255 - lum_b = GetBluePart (light_color) / 255 - else - lum_r = 1 - lum_g = 1 - lum_b = 1 - -// Macro that applies light to a new corner. -// It is a macro in the interest of speed, yet not having to copy paste it. -// If you're wondering what's with the backslashes, the backslashes cause BYOND to not automatically end the line. -// As such this all gets counted as a single line. -// The braces and semicolons are there to be able to do this on a single line. -#define LUM_FALLOFF(C, T) (1 - CLAMP01(sqrt((C.x - T.x) ** 2 + (C.y - T.y) ** 2 + LIGHTING_HEIGHT) / max(1, light_range))) - -#define APPLY_CORNER(C) \ - . = LUM_FALLOFF(C, pixel_turf); \ - . *= light_power; \ - var/OLD = effect_str[C]; \ - effect_str[C] = .; \ - \ - C.update_lumcount \ - ( \ - (. * lum_r) - (OLD * applied_lum_r), \ - (. * lum_g) - (OLD * applied_lum_g), \ - (. * lum_b) - (OLD * applied_lum_b) \ - ); - -#define REMOVE_CORNER(C) \ - . = -effect_str[C]; \ - C.update_lumcount \ - ( \ - . * applied_lum_r, \ - . * applied_lum_g, \ - . * applied_lum_b \ - ); - -// This is the define used to calculate falloff. - -/datum/light_source/proc/remove_lum() - applied = FALSE - var/thing - for (thing in affecting_turfs) - var/turf/T = thing - LAZYREMOVE(T.affecting_lights, src) - - affecting_turfs = null - - var/datum/lighting_corner/C - for (thing in effect_str) - C = thing - REMOVE_CORNER(C) - - LAZYREMOVE(C.affecting, src) - - effect_str = null - -/datum/light_source/proc/recalc_corner(var/datum/lighting_corner/C) - LAZYINITLIST(effect_str) - if (effect_str[C]) // Already have one. - REMOVE_CORNER(C) - effect_str[C] = 0 - - APPLY_CORNER(C) - UNSETEMPTY(effect_str) - -/datum/light_source/proc/update_corners() - var/update = FALSE - var/atom/source_atom = src.source_atom - - if (QDELETED(source_atom)) - qdel(src) - return - - if (source_atom.light_power != light_power) - light_power = source_atom.light_power - update = TRUE - - if (source_atom.light_range != light_range) - light_range = source_atom.light_range - update = TRUE - - if (!top_atom) - top_atom = source_atom - update = TRUE - - if (!light_range || !light_power) - qdel(src) - return - - if (isturf(top_atom)) - if (source_turf != top_atom) - source_turf = top_atom - pixel_turf = source_turf - update = TRUE - else if (top_atom.loc != source_turf) - source_turf = top_atom.loc - pixel_turf = get_turf_pixel(top_atom) - update = TRUE - else - var/P = get_turf_pixel(top_atom) - if (P != pixel_turf) - pixel_turf = P - update = TRUE - - if (!isturf(source_turf)) - if (applied) - remove_lum() - return - - if (light_range && light_power && !applied) - update = TRUE - - if (source_atom.light_color != light_color) - light_color = source_atom.light_color - parse_light_color() - update = TRUE - - else if (applied_lum_r != lum_r || applied_lum_g != lum_g || applied_lum_b != lum_b) - update = TRUE - - if (update) - needs_update = LIGHTING_CHECK_UPDATE - applied = TRUE - else if (needs_update == LIGHTING_CHECK_UPDATE) - return //nothing's changed - - var/list/datum/lighting_corner/corners = list() - var/list/turf/turfs = list() - var/thing - var/datum/lighting_corner/C - var/turf/T - if (source_turf) - var/oldlum = source_turf.luminosity - source_turf.luminosity = CEILING(light_range, 1) - for(T in view(CEILING(light_range, 1), source_turf)) - for (thing in T.get_corners(source_turf)) - C = thing - corners[C] = 0 - turfs += T - source_turf.luminosity = oldlum - - LAZYINITLIST(affecting_turfs) - var/list/L = turfs - affecting_turfs // New turfs, add us to the affecting lights of them. - affecting_turfs += L - for (thing in L) - T = thing - LAZYADD(T.affecting_lights, src) - - L = affecting_turfs - turfs // Now-gone turfs, remove us from the affecting lights. - affecting_turfs -= L - for (thing in L) - T = thing - LAZYREMOVE(T.affecting_lights, src) - - LAZYINITLIST(effect_str) - if (needs_update == LIGHTING_VIS_UPDATE) - for (thing in corners - effect_str) // New corners - C = thing - LAZYADD(C.affecting, src) - if (!C.active) - effect_str[C] = 0 - continue - APPLY_CORNER(C) - else - L = corners - effect_str - for (thing in L) // New corners - C = thing - LAZYADD(C.affecting, src) - if (!C.active) - effect_str[C] = 0 - continue - APPLY_CORNER(C) - - for (thing in corners - L) // Existing corners - C = thing - if (!C.active) - effect_str[C] = 0 - continue - APPLY_CORNER(C) - - L = effect_str - corners - for (thing in L) // Old, now gone, corners. - C = thing - REMOVE_CORNER(C) - LAZYREMOVE(C.affecting, src) - effect_str -= L - - applied_lum_r = lum_r - applied_lum_g = lum_g - applied_lum_b = lum_b - - UNSETEMPTY(effect_str) - UNSETEMPTY(affecting_turfs) - -#undef EFFECT_UPDATE -#undef LUM_FALLOFF -#undef REMOVE_CORNER -#undef APPLY_CORNER +// This is where the fun begins. +// These are the main datums that emit light. + +/datum/light_source + var/atom/top_atom // The atom we're emitting light from (for example a mob if we're from a flashlight that's being held). + var/atom/source_atom // The atom that we belong to. + + var/turf/source_turf // The turf under the above. + var/turf/pixel_turf // The turf the top_atom appears to over. + var/light_power // Intensity of the emitter light. + var/light_range // The range of the emitted light. + var/light_color // The colour of the light, string, decomposed by parse_light_color() + + // Variables for keeping track of the colour. + var/lum_r + var/lum_g + var/lum_b + + // The lumcount values used to apply the light. + var/tmp/applied_lum_r + var/tmp/applied_lum_g + var/tmp/applied_lum_b + + var/list/datum/lighting_corner/effect_str // List used to store how much we're affecting corners. + var/list/turf/affecting_turfs + + var/applied = FALSE // Whether we have applied our light yet or not. + + var/needs_update = LIGHTING_NO_UPDATE // Whether we are queued for an update. + + +/datum/light_source/New(var/atom/owner, var/atom/top) + source_atom = owner // Set our new owner. + LAZYADD(source_atom.light_sources, src) + top_atom = top + if (top_atom != source_atom) + LAZYADD(top_atom.light_sources, src) + + source_turf = top_atom + pixel_turf = get_turf_pixel(top_atom) || source_turf + + light_power = source_atom.light_power + light_range = source_atom.light_range + light_color = source_atom.light_color + + parse_light_color() + + update() + + return ..() + +/datum/light_source/Destroy(force) + remove_lum() + if (source_atom) + LAZYREMOVE(source_atom.light_sources, src) + + if (top_atom) + LAZYREMOVE(top_atom.light_sources, src) + + if (needs_update) + GLOB.lighting_update_lights -= src + + . = ..() + +// Yes this doesn't align correctly on anything other than 4 width tabs. +// If you want it to go switch everybody to elastic tab stops. +// Actually that'd be great if you could! +#define EFFECT_UPDATE(level) \ + if (needs_update == LIGHTING_NO_UPDATE) \ + GLOB.lighting_update_lights += src; \ + if (needs_update < level) \ + needs_update = level; \ + + +// This proc will cause the light source to update the top atom, and add itself to the update queue. +/datum/light_source/proc/update(var/atom/new_top_atom) + // This top atom is different. + if (new_top_atom && new_top_atom != top_atom) + if(top_atom != source_atom && top_atom.light_sources) // Remove ourselves from the light sources of that top atom. + LAZYREMOVE(top_atom.light_sources, src) + + top_atom = new_top_atom + + if (top_atom != source_atom) + LAZYADD(top_atom.light_sources, src) // Add ourselves to the light sources of our new top atom. + + EFFECT_UPDATE(LIGHTING_CHECK_UPDATE) + +// Will force an update without checking if it's actually needed. +/datum/light_source/proc/force_update() + EFFECT_UPDATE(LIGHTING_FORCE_UPDATE) + +// Will cause the light source to recalculate turfs that were removed or added to visibility only. +/datum/light_source/proc/vis_update() + EFFECT_UPDATE(LIGHTING_VIS_UPDATE) + +// Decompile the hexadecimal colour into lumcounts of each perspective. +/datum/light_source/proc/parse_light_color() + if (light_color) + lum_r = GetRedPart (light_color) / 255 + lum_g = GetGreenPart (light_color) / 255 + lum_b = GetBluePart (light_color) / 255 + else + lum_r = 1 + lum_g = 1 + lum_b = 1 + +// Macro that applies light to a new corner. +// It is a macro in the interest of speed, yet not having to copy paste it. +// If you're wondering what's with the backslashes, the backslashes cause BYOND to not automatically end the line. +// As such this all gets counted as a single line. +// The braces and semicolons are there to be able to do this on a single line. + +//Original lighting falloff calculation. This looks the best out of the three. However, this is also the most expensive. +//#define LUM_FALLOFF(C, T) (1 - CLAMP01(sqrt((C.x - T.x) ** 2 + (C.y - T.y) ** 2 + LIGHTING_HEIGHT) / max(1, light_range))) + +//Cubic lighting falloff. This has the *exact* same range as the original lighting falloff calculation, down to the exact decimal, but it looks a little unnatural due to the harsher falloff and how it's generally brighter across the board. +//#define LUM_FALLOFF(C, T) (1 - CLAMP01((((C.x - T.x) * (C.x - T.x)) + ((C.y - T.y) * (C.y - T.y)) + LIGHTING_HEIGHT) / max(1, light_range*light_range))) + +//Linear lighting falloff. This resembles the original lighting falloff calculation the best, but results in lights having a slightly larger range, which is most noticable with large light sources. This looks the darkest out of the three due to how lights are brighter closer to the source compared to the original falloff algorithm. This falloff method also does not at all take into account lighting height, as it acts as a flat reduction to light range with this method. +#define LUM_FALLOFF(C, T) (1 - CLAMP01(((abs(C.x - T.x) + abs(C.y - T.y))) / max(1, light_range))) + +#define APPLY_CORNER(C) \ + . = LUM_FALLOFF(C, pixel_turf); \ + . *= light_power; \ + var/OLD = effect_str[C]; \ + effect_str[C] = .; \ + \ + C.update_lumcount \ + ( \ + (. * lum_r) - (OLD * applied_lum_r), \ + (. * lum_g) - (OLD * applied_lum_g), \ + (. * lum_b) - (OLD * applied_lum_b) \ + ); + +#define REMOVE_CORNER(C) \ + . = -effect_str[C]; \ + C.update_lumcount \ + ( \ + . * applied_lum_r, \ + . * applied_lum_g, \ + . * applied_lum_b \ + ); + +// This is the define used to calculate falloff. + +/datum/light_source/proc/remove_lum() + applied = FALSE + var/thing + for (thing in affecting_turfs) + var/turf/T = thing + LAZYREMOVE(T.affecting_lights, src) + + affecting_turfs = null + + var/datum/lighting_corner/C + for (thing in effect_str) + C = thing + REMOVE_CORNER(C) + + LAZYREMOVE(C.affecting, src) + + effect_str = null + +/datum/light_source/proc/recalc_corner(var/datum/lighting_corner/C) + LAZYINITLIST(effect_str) + if (effect_str[C]) // Already have one. + REMOVE_CORNER(C) + effect_str[C] = 0 + + APPLY_CORNER(C) + UNSETEMPTY(effect_str) + +/datum/light_source/proc/update_corners() + var/update = FALSE + var/atom/source_atom = src.source_atom + + if (QDELETED(source_atom)) + qdel(src) + return + + if (source_atom.light_power != light_power) + light_power = source_atom.light_power + update = TRUE + + if (source_atom.light_range != light_range) + light_range = source_atom.light_range + update = TRUE + + if (!top_atom) + top_atom = source_atom + update = TRUE + + if (!light_range || !light_power) + qdel(src) + return + + if (isturf(top_atom)) + if (source_turf != top_atom) + source_turf = top_atom + pixel_turf = source_turf + update = TRUE + else if (top_atom.loc != source_turf) + source_turf = top_atom.loc + pixel_turf = get_turf_pixel(top_atom) + update = TRUE + else + var/P = get_turf_pixel(top_atom) + if (P != pixel_turf) + pixel_turf = P + update = TRUE + + if (!isturf(source_turf)) + if (applied) + remove_lum() + return + + if (light_range && light_power && !applied) + update = TRUE + + if (source_atom.light_color != light_color) + light_color = source_atom.light_color + parse_light_color() + update = TRUE + + else if (applied_lum_r != lum_r || applied_lum_g != lum_g || applied_lum_b != lum_b) + update = TRUE + + if (update) + needs_update = LIGHTING_CHECK_UPDATE + applied = TRUE + else if (needs_update == LIGHTING_CHECK_UPDATE) + return //nothing's changed + + var/list/datum/lighting_corner/corners = list() + var/list/turf/turfs = list() + var/thing + var/datum/lighting_corner/C + var/turf/T + if (source_turf) + var/oldlum = source_turf.luminosity + source_turf.luminosity = CEILING(light_range, 1) + for(T in view(CEILING(light_range, 1), source_turf)) + for (thing in T.get_corners(source_turf)) + C = thing + corners[C] = 0 + turfs += T + source_turf.luminosity = oldlum + + LAZYINITLIST(affecting_turfs) + var/list/L = turfs - affecting_turfs // New turfs, add us to the affecting lights of them. + affecting_turfs += L + for (thing in L) + T = thing + LAZYADD(T.affecting_lights, src) + + L = affecting_turfs - turfs // Now-gone turfs, remove us from the affecting lights. + affecting_turfs -= L + for (thing in L) + T = thing + LAZYREMOVE(T.affecting_lights, src) + + LAZYINITLIST(effect_str) + if (needs_update == LIGHTING_VIS_UPDATE) + for (thing in corners - effect_str) // New corners + C = thing + LAZYADD(C.affecting, src) + if (!C.active) + effect_str[C] = 0 + continue + APPLY_CORNER(C) + else + L = corners - effect_str + for (thing in L) // New corners + C = thing + LAZYADD(C.affecting, src) + if (!C.active) + effect_str[C] = 0 + continue + APPLY_CORNER(C) + + for (thing in corners - L) // Existing corners + C = thing + if (!C.active) + effect_str[C] = 0 + continue + APPLY_CORNER(C) + + L = effect_str - corners + for (thing in L) // Old, now gone, corners. + C = thing + REMOVE_CORNER(C) + LAZYREMOVE(C.affecting, src) + effect_str -= L + + applied_lum_r = lum_r + applied_lum_g = lum_g + applied_lum_b = lum_b + + UNSETEMPTY(effect_str) + UNSETEMPTY(affecting_turfs) + +#undef EFFECT_UPDATE +#undef LUM_FALLOFF +#undef REMOVE_CORNER +#undef APPLY_CORNER From 8ea35bf6d814ba3885d2d2486030c87b68e5ab19 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Wed, 27 Mar 2019 00:39:52 -0400 Subject: [PATCH 090/142] Adds a somewhat hacky octagonal linear lighting algorithm --- code/modules/lighting/lighting_source.dm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index bde0a61be5..de9e8a90ca 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -117,8 +117,12 @@ //Cubic lighting falloff. This has the *exact* same range as the original lighting falloff calculation, down to the exact decimal, but it looks a little unnatural due to the harsher falloff and how it's generally brighter across the board. //#define LUM_FALLOFF(C, T) (1 - CLAMP01((((C.x - T.x) * (C.x - T.x)) + ((C.y - T.y) * (C.y - T.y)) + LIGHTING_HEIGHT) / max(1, light_range*light_range))) -//Linear lighting falloff. This resembles the original lighting falloff calculation the best, but results in lights having a slightly larger range, which is most noticable with large light sources. This looks the darkest out of the three due to how lights are brighter closer to the source compared to the original falloff algorithm. This falloff method also does not at all take into account lighting height, as it acts as a flat reduction to light range with this method. -#define LUM_FALLOFF(C, T) (1 - CLAMP01(((abs(C.x - T.x) + abs(C.y - T.y))) / max(1, light_range))) +//Linear lighting falloff. This resembles the original lighting falloff calculation the best, but results in lights having a slightly larger range, which is most noticable with large light sources. This also results in lights being diamond-shaped, fuck. This looks the darkest out of the three due to how lights are brighter closer to the source compared to the original falloff algorithm. This falloff method also does not at all take into account lighting height, as it acts as a flat reduction to light range with this method. +//#define LUM_FALLOFF(C, T) (1 - CLAMP01(((abs(C.x - T.x) + abs(C.y - T.y))) / max(1, light_range+1))) + +//Linear lighting falloff but with an octagonal shape in place of a diamond shape. Lummox JR please add pointer support. +#define GET_LUM_DIST(DISTX, DISTY) (DISTX + DISTY + abs(DISTX - DISTY)*0.4) +#define LUM_FALLOFF(C, T) (1 - CLAMP01(GET_LUM_DIST(abs(C.x - T.x), abs(C.y - T.y)) / max(1, light_range+1))) #define APPLY_CORNER(C) \ . = LUM_FALLOFF(C, pixel_turf); \ @@ -302,5 +306,6 @@ #undef EFFECT_UPDATE #undef LUM_FALLOFF +#undef GET_LUM_DIST #undef REMOVE_CORNER #undef APPLY_CORNER From 8d84299d6de66c4071f19ca57272095d5a514b46 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Wed, 27 Mar 2019 03:18:41 -0500 Subject: [PATCH 091/142] Feeding works! aaaaayyy. Didn't have to martial art it either --- code/modules/mob/living/living_defense.dm | 14 ++++++++ .../code/modules/mob/living/carbon/carbon.dm | 2 -- .../mob/living/carbon/human/human_defense.dm | 2 +- .../code/modules/vore/eating/belly_obj_vr.dm | 15 +++++++++ .../code/modules/vore/eating/living_vr.dm | 33 +++++++++++-------- .../code/modules/vore/eating/vorepanel_vr.dm | 3 +- 6 files changed, 51 insertions(+), 18 deletions(-) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index f5b44db70f..dddbe18666 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -129,6 +129,18 @@ /mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = 0) if(user == src || anchored || !isturf(user.loc)) return FALSE + + if(user.pulling && user.grab_state == GRAB_AGGRESSIVE && user.voremode) + if(ismob(user.pulling)) + var/mob/P = user.pulling + if(P != src) + to_chat(world, "grabbedby check : [user], [P], [src] (target).") + user.vore_attack(user, P, src) //feed grabbed to other + else + to_chat(world, "grabbedby check : [user], [P], [src] (target).") + user.vore_attack(user, P, src) //feed self to grabbed + return + if(!user.pulling || user.pulling != src) user.start_pulling(src, supress_message) return @@ -163,6 +175,8 @@ return 0 if(!user.pulling || user.pulling != src || user.grab_state != old_grab_state || user.a_intent != INTENT_GRAB) return 0 + if(user.voremode && user.grab_state == GRAB_AGGRESSIVE) + return 0 user.grab_state++ switch(user.grab_state) if(GRAB_AGGRESSIVE) diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm index 95ebe54b29..75a482745a 100644 --- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm +++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm @@ -43,8 +43,6 @@ mob/living/carbon/proc/toggle_vore_mode() if(combatmode) return FALSE //let's not override the main draw of the game these days voremode = !voremode - if(client) - client.show_popup_menus = !voremode // it's the RIGHT way to nom. gettit if(hud_used && hud_used.static_inventory) for(var/obj/screen/voretoggle/selector in hud_used.static_inventory) selector.rebaseintomygut(src) diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm b/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm index c1fc6623de..23add047ca 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm @@ -1,6 +1,6 @@ /mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = 0) if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && isliving(pulling)) - vore_attack(user, pulling) + vore_attack(user, pulling, user) //feeding prey to self else ..() diff --git a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm index 142e5880d5..87c4ba495c 100644 --- a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm +++ b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm @@ -184,6 +184,10 @@ // Returns the number of mobs so released. /obj/belly/proc/release_all_contents(var/include_absorbed = FALSE, var/silent = FALSE) var/atom/destination = drop_location() + //Don't bother if we don't have contents + if(!contents.len) + return 0 + var/count = 0 for(var/thing in contents) var/atom/movable/AM = thing @@ -204,6 +208,12 @@ for(var/mob/M in get_hearers_in_view(2, get_turf(owner))) if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES)) playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + + //Clean up our own business + items_preserved.Cut() + if(isanimal(owner)) + owner.update_icons() + if(!silent) owner.visible_message("[owner] expels everything from their [lowertext(name)]!") items_preserved.Cut() @@ -244,6 +254,11 @@ if(P.absorbed) absorbed_count++ Pred.reagents.trans_to(Prey, Pred.reagents.total_volume / absorbed_count) + + //Clean up our own business + if(isanimal(owner)) + owner.update_icons() + if(!silent) owner.visible_message("[owner] expels [M] from their [lowertext(name)]!") owner.update_icons() diff --git a/modular_citadel/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm index 45f5667bcb..cfbdcd49fa 100644 --- a/modular_citadel/code/modules/vore/eating/living_vr.dm +++ b/modular_citadel/code/modules/vore/eating/living_vr.dm @@ -81,35 +81,38 @@ if(!user || !prey || !pred) return - if(prey == src) //you click your target - if(!src.feeding) + if(!isliving(pred)) //no badmin, you can't feed people to ghosts or objects. + return + + if(pred == prey) //you click your target + if(!pred.feeding) to_chat(user, "They aren't able to be fed.") - to_chat(src, "[user] tried to feed you themselves, but you aren't voracious enough to be fed.") + to_chat(pred, "[user] tried to feed you themselves, but you aren't voracious enough to be fed.") return - if(!is_vore_predator(prey)) + if(!is_vore_predator(pred)) to_chat(user, "They aren't voracious enough.") return - feed_self_to_grabbed(user, src) + feed_self_to_grabbed(user, pred) - if(user == src) //you click yourself + else if(pred == user) //you click yourself if(!is_vore_predator(src)) to_chat(user, "You aren't voracious enough.") return - user.feed_grabbed_to_self(src, prey) + feed_grabbed_to_self(user, prey) else // click someone other than you/prey - if(!src.feeding) + if(!pred.feeding) to_chat(user, "They aren't voracious enough to be fed.") - to_chat(src, "[user] tried to feed you [prey], but you aren't voracious enough to be fed.") + to_chat(pred, "[user] tried to feed you [prey], but you aren't voracious enough to be fed.") return if(!prey.feeding) to_chat(user, "They aren't able to be fed to someone.") - to_chat(prey, "[user] tried to feed you to [src], but you aren't able to be fed to them.") + to_chat(prey, "[user] tried to feed you to [pred], but you aren't able to be fed to them.") return - if(!is_vore_predator(src)) + if(!is_vore_predator(pred)) to_chat(user, "They aren't voracious enough.") return - feed_grabbed_to_other(user, prey, src) + feed_grabbed_to_other(user, prey, pred) // // Eating procs depending on who clicked what // @@ -330,9 +333,9 @@ return //Actual escaping forceMove(get_turf(src)) //Just move me up to the turf, let's not cascade through bellies, there's been a problem, let's just leave. - if(is_blind(src) && !has_trait(TRAIT_BLIND)) - src.adjust_blindness(-1) + src.cure_blind("belly_[REF(src)]") src.stop_sound_channel(CHANNEL_PREYLOOP) + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "fedprey", /datum/mood_event/fedprey) for(var/mob/living/simple_animal/SA in range(10)) SA.prey_excludes[src] = world.time @@ -384,6 +387,7 @@ P.digestable = src.digestable P.devourable = src.devourable + P.feeding = src.feeding P.vore_taste = src.vore_taste var/list/serialized = list() @@ -407,6 +411,7 @@ digestable = P.digestable devourable = P.devourable + feeding = P.feeding vore_taste = P.vore_taste release_vore_contents(silent = TRUE) diff --git a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm index 2125e6f0cb..1a1ec27093 100644 --- a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm +++ b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm @@ -56,7 +56,8 @@ /datum/vore_look/proc/gen_vui(var/mob/living/user) var/dat - + dat += "Remember to toggle the vore mode, it's to the left of your combat toggle. Open mouth means you're voracious!
    " + dat += "
    " var/atom/userloc = user.loc if (isbelly(userloc)) var/obj/belly/inside_belly = userloc From 6fdb5e97f8caf07096eff6a2e96346d2528aa38d Mon Sep 17 00:00:00 2001 From: Poojawa Date: Wed, 27 Mar 2019 03:43:18 -0500 Subject: [PATCH 092/142] removes debug and override --- code/modules/mob/living/living_defense.dm | 12 +++++------- .../modules/mob/living/carbon/human/human_defense.dm | 6 ------ .../code/modules/vore/eating/living_vr.dm | 2 +- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index dddbe18666..d4e14dbd20 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -127,20 +127,18 @@ IgniteMob() /mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = 0) - if(user == src || anchored || !isturf(user.loc)) + if(user == anchored || !isturf(user.loc)) return FALSE if(user.pulling && user.grab_state == GRAB_AGGRESSIVE && user.voremode) if(ismob(user.pulling)) var/mob/P = user.pulling - if(P != src) - to_chat(world, "grabbedby check : [user], [P], [src] (target).") - user.vore_attack(user, P, src) //feed grabbed to other - else - to_chat(world, "grabbedby check : [user], [P], [src] (target).") - user.vore_attack(user, P, src) //feed self to grabbed + user.vore_attack(user, P, src) // User, Prey, Predator return + if(user == src) //we want to be able to self click if we're voracious + return FALSE + if(!user.pulling || user.pulling != src) user.start_pulling(src, supress_message) return diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm b/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm index 23add047ca..bbff8ee750 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm @@ -1,9 +1,3 @@ -/mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = 0) - if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && isliving(pulling)) - vore_attack(user, pulling, user) //feeding prey to self - else - ..() - /mob/living/carbon/human/alt_attack_hand(mob/user) if(..()) return diff --git a/modular_citadel/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm index cfbdcd49fa..fa711e911c 100644 --- a/modular_citadel/code/modules/vore/eating/living_vr.dm +++ b/modular_citadel/code/modules/vore/eating/living_vr.dm @@ -94,7 +94,7 @@ return feed_self_to_grabbed(user, pred) - else if(pred == user) //you click yourself + if(pred == user) //you click yourself if(!is_vore_predator(src)) to_chat(user, "You aren't voracious enough.") return From 181b29e08cdc408f80de001862d4c9150eddde41 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Wed, 27 Mar 2019 03:46:30 -0500 Subject: [PATCH 093/142] slightly better commenting --- code/modules/mob/living/living_defense.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index d4e14dbd20..643c91b95a 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -133,7 +133,7 @@ if(user.pulling && user.grab_state == GRAB_AGGRESSIVE && user.voremode) if(ismob(user.pulling)) var/mob/P = user.pulling - user.vore_attack(user, P, src) // User, Prey, Predator + user.vore_attack(user, P, src) // User, Pulled, Predator target (which can be user, pulling, or src) return if(user == src) //we want to be able to self click if we're voracious From e6190fa141966345b707d26200a741affecadca8 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Wed, 27 Mar 2019 04:23:37 -0500 Subject: [PATCH 094/142] Make combat mode actually override the VM icon --- modular_citadel/code/_onclick/hud/screen_objects.dm | 2 +- modular_citadel/code/modules/mob/living/carbon/carbon.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modular_citadel/code/_onclick/hud/screen_objects.dm b/modular_citadel/code/_onclick/hud/screen_objects.dm index 668abcb3d1..511627b81f 100644 --- a/modular_citadel/code/_onclick/hud/screen_objects.dm +++ b/modular_citadel/code/_onclick/hud/screen_objects.dm @@ -61,7 +61,7 @@ /obj/screen/voretoggle/proc/rebaseintomygut(mob/living/carbon/C) if(!C) return - if(C.voremode) + if(C.voremode && !C.combatmode) icon_state = "nom" else icon_state = "nom_off" diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm index 75a482745a..cd24bfc8a2 100644 --- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm +++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm @@ -40,12 +40,12 @@ return TRUE mob/living/carbon/proc/toggle_vore_mode() - if(combatmode) - return FALSE //let's not override the main draw of the game these days voremode = !voremode if(hud_used && hud_used.static_inventory) for(var/obj/screen/voretoggle/selector in hud_used.static_inventory) selector.rebaseintomygut(src) + if(combatmode) + return FALSE //let's not override the main draw of the game these days SEND_SIGNAL(src, COMSIG_VORE_TOGGLED, src, voremode) return TRUE From 88d6cf7da8749f66f7a01087a8d449746cd689d4 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Wed, 27 Mar 2019 10:33:06 -0500 Subject: [PATCH 095/142] actually fix the god-damned sound issues. fuck --- code/modules/mob/living/death.dm | 3 +++ .../code/modules/vore/eating/belly_obj_vr.dm | 12 ++++++++---- .../code/modules/vore/eating/vorepanel_vr.dm | 14 ++++++++------ 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index f6888a21ec..11e0c56d9e 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -8,6 +8,8 @@ spill_organs(no_brain, no_organs, no_bodyparts) + release_vore_contents(silent = TRUE) // return of the bomb safe internals. + if(!no_bodyparts) spread_bodyparts(no_brain, no_organs) @@ -36,6 +38,7 @@ buckled.unbuckle_mob(src, force = TRUE) dust_animation() + release_vore_contents(silent = TRUE) //technically grief protection, I guess? if they're SM'd it doesn't matter seconds after anyway. spawn_dust(just_ash) QDEL_IN(src,5) // since this is sometimes called in the middle of movement, allow half a second for movement to finish, ghosting to happen and animation to play. Looks much nicer and doesn't cause multiple runtimes. diff --git a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm index 87c4ba495c..e931f37520 100644 --- a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm +++ b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm @@ -170,7 +170,8 @@ if(is_wet && !recent_sound) for(var/mob/M in get_hearers_in_view(2, get_turf(owner))) if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES)) - playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + var/sound/devourments = GLOB.vore_sounds[vore_sound] + playsound(get_turf(owner),devourments,50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) recent_sound = TRUE //Messages if it's a mob @@ -207,7 +208,8 @@ count++ for(var/mob/M in get_hearers_in_view(2, get_turf(owner))) if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES)) - playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + var/sound/releasement = GLOB.release_sounds[release_sound] + playsound(get_turf(owner),releasement,50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) //Clean up our own business items_preserved.Cut() @@ -232,7 +234,8 @@ items_preserved -= M for(var/mob/H in get_hearers_in_view(2, get_turf(owner))) if(H.client && (H.client.prefs.cit_toggles & EATING_NOISES)) - playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + var/sound/releasement = GLOB.release_sounds[release_sound] + playsound(get_turf(owner),releasement,50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) if(istype(M,/mob/living)) var/mob/living/ML = M @@ -315,7 +318,8 @@ if(!silent) for(var/mob/M in get_hearers_in_view(5, get_turf(owner))) if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES)) - playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + var/sound/devourments = GLOB.vore_sounds[vore_sound] + playsound(get_turf(owner),devourments,50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) owner.updateVRPanel() for(var/mob/living/M in contents) M.updateVRPanel() diff --git a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm index 1a1ec27093..c83ee788cb 100644 --- a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm +++ b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm @@ -116,6 +116,8 @@ spanstyle = "color:purple;" if(DM_ABSORB) spanstyle = "color:purple;" + if(DM_DRAGON) + spanstyle = "color:blue;" dat += " ([B.contents.len])

  • " @@ -550,9 +552,9 @@ selected.release_sound = choice if(href_list["b_releasesoundtest"]) - var/soundfile = selected.release_sound - if(soundfile) - user << soundfile + var/sound/releasetest = GLOB.release_sounds[selected.release_sound] + if(releasetest) + user << releasetest if(href_list["b_sound"]) var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in GLOB.vore_sounds @@ -563,9 +565,9 @@ selected.vore_sound = choice if(href_list["b_soundtest"]) - var/soundfile = selected.vore_sound - if(soundfile) - user << soundfile + var/sound/voretest = GLOB.vore_sounds[selected.vore_sound] + if(voretest) + user << voretest if(href_list["b_tastes"]) selected.can_taste = !selected.can_taste From d4503e77de2095b928a5b737c86d501beb7797a3 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Wed, 27 Mar 2019 10:58:38 -0500 Subject: [PATCH 096/142] Chance for quiet belly growls if HONGRY --- code/game/sound.dm | 3 +++ code/modules/mob/living/carbon/human/species.dm | 7 +++++++ .../code/modules/vore/eating/living_vr.dm | 2 +- sound/vore/growl1.ogg | Bin 0 -> 18952 bytes sound/vore/growl2.ogg | Bin 0 -> 16247 bytes sound/vore/growl3.ogg | Bin 0 -> 14842 bytes sound/vore/growl4.ogg | Bin 0 -> 27683 bytes sound/vore/growl5.ogg | Bin 0 -> 21808 bytes 8 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 sound/vore/growl1.ogg create mode 100644 sound/vore/growl2.ogg create mode 100644 sound/vore/growl3.ogg create mode 100644 sound/vore/growl4.ogg create mode 100644 sound/vore/growl5.ogg diff --git a/code/game/sound.dm b/code/game/sound.dm index cceed31cfb..5503c6103d 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -213,6 +213,9 @@ 'sound/vore/prey/death_04.ogg','sound/vore/prey/death_05.ogg','sound/vore/prey/death_06.ogg', 'sound/vore/prey/death_07.ogg','sound/vore/prey/death_08.ogg','sound/vore/prey/death_09.ogg', 'sound/vore/prey/death_10.ogg') + if("hunger_sounds") + soundin = pick( 'sound/vore/growl1.ogg','sound/vore/growl2.ogg','sound/vore/growl3.ogg','sound/vore/growl4.ogg', + 'sound/vore/growl5.ogg') if("clang") soundin = pick('sound/effects/clang1.ogg', 'sound/effects/clang2.ogg') if("clangsmall") diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 0e5eef2ffb..61b6ac0bec 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1144,6 +1144,13 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.update_inv_w_uniform() H.update_inv_wear_suit() + if(H.noisy && H.nutrition <= NUTRITION_LEVEL_HUNGRY) + if(prob(10)) + playsound(get_turf(H),"hunger_sounds",15,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED) + else if(H.noisy && H.nutrition <= NUTRITION_LEVEL_STARVING) + if(prob(10)) + playsound(get_turf(H),"hunger_sounds",35,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED) + // nutrition decrease and satiety if (H.nutrition > 0 && H.stat != DEAD && !H.has_trait(TRAIT_NOHUNGER)) // THEY HUNGER diff --git a/modular_citadel/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm index fa711e911c..469dcee276 100644 --- a/modular_citadel/code/modules/vore/eating/living_vr.dm +++ b/modular_citadel/code/modules/vore/eating/living_vr.dm @@ -9,7 +9,7 @@ var/vore_taste = null // What the character tastes like var/no_vore = FALSE // If the character/mob can vore. var/openpanel = 0 // Is the vore panel open? - var/noisy = FALSE // tummies are rumbly? + var/noisy = TRUE // tummies are rumbly? var/absorbed = FALSE //are we absorbed? var/next_preyloop diff --git a/sound/vore/growl1.ogg b/sound/vore/growl1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6a9cef898849fa6e7c48b0e23ed78398328110db GIT binary patch literal 18952 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

    Rz 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 XgIWP_KR*{gp50i_ZY=j8Khp#Nq{LoI literal 0 HcmV?d00001 diff --git a/sound/vore/growl2.ogg b/sound/vore/growl2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..17a9a945599900f45f6899f33c64bfa7aba32938 GIT binary patch literal 16247 zcmajG1z1(V*Dt&e4N}q|acB;LbPLj59zwd2?w0T%NJ&XacXxLw(%mVcNS8_o2z(p; zzxRE=`+d*7`x)k$J!{WeGi&|U+H3Y1)U2#D03_f)R|V`}Lt92?8bS^6baFMbal7w= zNSFWT5iiK!Ml(e1e&qkU?nmBJXgu0h@Y(PFU)Lb=KSop_UB|}R`iYvW71Z9wO#3f; zr~;ImlT(0`pPT!h8wB;=!!SuHZ3ut?_HZdfdl3_{S^$6#045AD-1wIYu!4jf7N6t< z`TJHcXLxc#crTfGBv;>mRZw0FVgNt^5G-A~OhE2EkwOj8a1G_?B!k*dw&#R=lRPpSnkri0)UDzcBCr*nkjC85 zqWO>Ce_&B!ls@)RXagJ(zLaLyf@ui0E-liJMltXE{&)C@gLX4rAnVI`1NDzaGb5rc zq>ZO`kHL-4<{E(IQ%6P1DwYJP!^xQo+~53NITQeb@&BUuzpB4b{)giHxCquEmbww{ zVYd6Kyk|^!zq$us3Y!Z=F&iI<;;4qLOt(rQdAov!IladP32;SN!9R}zjS97hl|Uo^ z>m(t`u0yaQ&@29@;Z7LFA5u;Jk23y)@;Lz`SSGpIHF!j|G__uMI_Q4zSZ;c2xZtri z@4q%5WlS3KzXR)kc@6+NP4HizOfZY&>Q4_+mBjpK;Q#U*7oz_6l!NaXlxi7Nrr1V* z@~Zvfog|cb&a0w9Y&c2mF->Br!EZRtXF089IqPY;*l4NWMle2 zKMeo?-Lcq8f8)q=IQuM|Zx+t3r78M<_85>l%d0ZY3o14d0LTG=9yD?=euQhRq@$<~ z2G|g6}7Gi1TpeROxXeiF7LIZ{Gf*4@f zLjj%x0D^0P>ob|_n8IMT^cWXrM#6v)b3y!+0*pP0j0eV8NMQagJ#R{3Fh7AzDIz1E zz&yMH90Z_)e-CmdVu>N*L;zrh4ab7LO@NQVwqoH!T;D0-ib6%{8e>8jRKY`BXcg|765>DL%=^t7G4V(0G}CHcV-xm=T#zNR3elaC$gL;RGClY z9p&YFuBkOls5PspwM?R-)ySwqsG@SJsYNKGMXWWQq@vZ}FwSeasHydZL~FLua+xIH zMUuxFkBTmMI|oud=9B!5=Nt@^|HDd!=r1dNt@%d2=k8k1wJdctwRAl#buYAD%=s&U zR1K9yVlAykt;I73tt9^qcP+ygmWvl!x+DSm^KUoK{Wr+&InU2}fK<~tOVcKgH5Qvx z8{6FC(o~kx(vs3fhtkRl{oI|>+|r?1tJ2Eyq1vjlO8b3~T3K9L%T`*-R#sbnUCOrK zSX|m#F;rWfR#~>+c>JJ;ZNJsIw6e0S_TZk{TCv~fvfs+-R|p#}EZb`>X>E1fZ*>`I zbfC;D-Roo>{!~3wd%WMuQSU+fT+8E2g5kFp;5ru@J1h-;Vt~W?1{6n$Zda>G1@L z*06*rIC@Tjx}sf9!W`VLrf|mW5SmY-Xv3Z`rDt2xH=`H%&>Ww8JKthV0kfd~o&d7i z&d$e`R4m9RQc`5s9sz-zHzgrol24$aP|^UhD##~MQsinR(s$&VqXb9f6X+|z`iL|f z*!xoH`=B7J!F%C)CV7 zrNiy{z*&K;;uP)K`}Fjc8$9s!9{inEMT54TZABj_oUwpRNwKDZ#Lkgxi$c++;$C=3 zFNuCMC|tviuW-)xo}lj_I+yCESTQ#Pj{*ti4jr?pzQ_Nyax+`@zB#jsd*Q4#iE*It zttGukp@bxd95rsRkabBU|6Bn+lCB7wo!FeU_p_09=lFcy#~v9kAS z+rePqD%ioiXyt6 zSCW<7d`yA`7Obww3VVyMsK8hNrnFd;U_NI*k)T5fPUv48F~K&&<_dwjYjU$b3|3ZT zE(ruRTHyggp`dp}&$gm|K^&vv?HsofBM60;6`zy!9s|GuIH7~TafA_wMF+&m@<6#l zR`_NkLOYbaU}U5W#%1kG55kqiAO@!azN2U}kcSn_>AhnIT}~0aHH+j6 zfrF3qE|`^bOEV2RAKNunA%--?M={*3}9i0J$e6>qR zVt(DH$@RasrUjF2$-mmZ-x$C_TV&s(g;rV-MAbb;XoEpB{Ob#j{a=0f!rT9#1p;dO z-*XA-l7FFvkpuR@s6ddh{B1FUEzExj++Q#T6M(5)0?7GaUjhLr<8OMG0KZ2hsG57i zU#R|VVbb2K>+i#~|Hj_uf*?eZ@1rpN4ny7$ojvcyCuDW&0Yw0T4FE0+w)?QT0cdY} zaFSARtSi3RlZWsKA-Nh$dGcPe*#xcvA`Q6RPP$p-bF~a}MXsLm1Z_o@_iv_L%NsmL zz&#`s1K`A`(WMGS7n=U4#Jz1P=nGmrgnhoD?((t` z5o)!Rjq%jC%zhCR?S3l%QE&hq*x9EiwS1|NAyEprzi#cJnzNQ>p;?-%kyr4yZ%Di1HUkRSL^BnEHn`@IEe<4?6{y0Rx0D(5m%daJ5 zCT~{=JvmO=PjZ<4WfN}`vr9KPs%Ct5=hh{}EB)@k6|UTODDU-oDJrG+#O9FX47{vwBhch&bZ2GpRG$q3lTxf0{zm;PJ$*!di)EXCVpJvh;c} zg+6V9m+fl^zrk3w21R_&ALBsk;+4O6h$Sm2|9P|gBfi_UTN&BPjrVoCv@vRMm z;Yg7^(+>^V_l*4qc$!~gxBSLc!wQ#IGlTJk-f3gNl`wyteGSl|12}t-I%es3lP{SM ziSUlrPO zG+IRBkC}>_#3olV5AjL+kEde8+RKUvu|$UDa4HX2cof9ybfluUB8B=Z<+i5oe?>o@f1zIoxF8AoT-%3er6qp-CSWZmTCI3IVj_ zI3{oaKzPh%-~{+XEX`+58>$OSW(j!M`#rNV5)K#`OHpE+>yHM0bvEIu&eetLq4)>$ zPC{16MbY{WV$72B~iWtX9;Zx60Tw%EW8SSz>@~0 zj)DNJSm-dhf{Eka zNf);vLulr=28a9*gd~u?TJ>f&fdD|f!Mlz;U*u7kvn5BRlni$1bDER%5~@v;Ze`x( z+BrA;tW<#mAod;3GQV5e;00cNR;MIf!&BFN`b zTeqMs8mPd|_mkVNb)sZTNy6;+jK zZ*O0&b=@wbd!!2~u4V{~m0X3XxL3`3P)#1#d2lcewZRDe-_h-U0pX7 zFe3RHtw73RII=4P`3lM(MW`a5U9XT~BqACk6=#vov_Pl)4d5ftGxr}|LL-Hm+9S5FDjez`}|FGVI?{~>n%xKSj)6in|x zj>s8!?@JSLEzP@LTy3gr%v?B&fu8ceT5xx$Dop=FktJToT$`o!IqF*nna z63JRrHOr+RtDfIDp%x#a`e)n^$(-{F z>#Vg3?Y4qVD%ozFT)ewRm%m>b-3&->za*X-BY-Hq@=#Mvzz9~P;r}g|gT;5-0nzf? zUCtj2+r<)_Rd;<-FIawE{ctN0dxce`)-9vXv4cSqqKx!nXYossELp_LbrO`~T~O5@ z-`VftX|GOdjcl=Or9WH0%P+gk-Ied|I=1QF5T=1q+n^XAks7`AA;l;PyShM{eRz;% zUXg$qQDhd2hIm=RwPY7q0>dG8`iEE z>f9qb260zC!vj~ywj_4&!;9LqgVfPCeHjL~FAvfOHD6{rM3w?TC+!eRh6e>Um^xj% zYZbfa!eChz1QXNy^DQBD?=Us^QRCKkgJi~*SH195$t)j|q;NgCXy_EgYGaVY>kSMV z#x8H5r}kz}zp+KjK2t_98F5n$O?)WBmSo0&1T{H_Rs0b4uG9UjLZ3SM$*+>39BI*L zt)_+ILXIUm&l3q%vt`A#rlqU?b0kypf++KX+vd12B!J>3!|RRYHJ;`t;SRS4WjEF> zXecT-OgJMDUWwKkVB^{GOHQP5UknC6)^^AUq+l{qdrg~i^3Y)iicSv`!oBz7y0OsLOBTHo5oHV5eIq!g+R%y=I!!+XbFIO6a;s?J+)|)1p6<=i zsTnEotac9x9X1o2Eq)M^N_wd1hLGG!{HVY~5`-c4Gn_3pgSi@Fji1Bi6WC|Kv^`*mb4Y)+GD*{Ihw8NF4(5m9l9J%<&_3bm@e$`+Fio>pS^6(toabmS-rfKr*rX z%ZymW{9pqa6Myh((A}+441tZztg4~G)JG~Ci>rQlIodano%O5XUmwZc6~80;v^32#xj^)`)?I5_BEZn9puhY?6xQ@@KTG|RI3SeHAvU_^K)BrC**xV}t*>!< zjznlL$X2?%222sApL)=s1>b25(@{C6lGN^g9jwwlQ&UGIwp%qQ_|d{KEXC?$FQ_H= zH+);&aA+KkESd*p3zDf+F@f7bzYx8NyqnXExScgNf-Q>ka_QEga}LyCjS|1K&8S~| zN}=421*@;G6rI$(4|g&RhsA^%-An7)2bbmG^&+=BiV0rge_YlgC`u{z0~EWRVx^_h zZkIhWGDNQ}kqs=c5Eg4^4M%3&IFkpPEE_usb1WTvyhq{n=T&N(?ri$IQ%jMtG|7gB zh|T!4p}dW>l{303_QS2)(>Ibx`A_|D7sTHKKNiPZa_jRnr=qLNTFK~h)%)~%eK4w@ zDBmd&yE%<8yi^7XIrwVu4NjskcNo=uaO2S?<^k#}zwP{N4d1~?iQk>)<@Uats7jolBDE0qq{Cc^KzAy6 z#YR(x2!4rDWc!}Zwnl-r65{06+=R!lIqSobBy0g#)n9ms+{)qf2|f#`U;Lu9NgB5 zG&R3^b!R2-^w#k~DP`XrR+3zcgMQ1&nA7R>?<7giP*qm}m~ez^XF|&+%c2g8^N`K^=Fjx(D*ccdgyH~fzVfazCtP=0rtIG!efm%J~3lEe8Xtm8)Az>MO0P| zeV1SJZxz0KItLQ=_%A6Af}#D+89rs3WBZq9z3J3sgmbhxr* z$6vWe?Z7DGOH(L|q-7jkuGl{BVst^1I{xqht#7^QW1{^0Urv2tDetA|DNb)%MaBoL zJ>=H9UKC7)_zpxawn>UFl}mMrG47J1h)}3T#nHdeFd0`>UphF=qP3IX+WQcp81W6` zY5Q5z3>SdtV^tOpb~5tUocx193d9Y>{K~e`=R48jJ;Rl$g)E?uK<7tf%rt7e5~syU z{lBo4lsreZnrAfjbFF`dia`0#2a(kO{vd)3Hff8#N)l~+U0fLM8tw;eT*b>UESt&tVgh@wVrx1>&y{t18#53V&YeljOWA3r9^+ zphFUj@TWR%H_D=%JpEFxSirvfz%wcJp|s}NOu%4H15``>_pO}|% zCl4p9eiCG_ATsBW>Tz7(y!h;FjKt><6!ydxNs z%z8Z>DYUNMXw5&}U*Wfr;SU^Pe89-M9oHrl&_xr+^;cJxy4Z7U!Gf;vJK!L)%8*C^ zLfT}A&C^xmcJ$}RO1G9pfgQ1)w@>X*lMe`dN=C19RcRC4dY0c+NPtSj>V+669T&}( zo?$ZPB7Jh|*ec0F{p2!sqsE3CW>RD1201c=mZrgL9^xPRFBGBRBMVy5y26w5lD4E_LhF?DRYsP+w`iTQSff)hX-;^D@sT+c>Aw1(mkXT zsHJw6#KS8&pAF)215T^}8-HJ`w~$?jA=y*nW|TWm(z)(e&)tKaOMSoRdr=oVx*aF^ z(M{1wYKrh`5RJ6Irff(@W?1`%3Jm`W!c~w)*E}J7LvmNt^+m>PrzC~;gj+0CpeKeN zjhArAmqGLx4$ix4m{Ufi3!0L;3 z98QUqKL#qQ60gNOC0mJ(q;M=65Ki_kaf>uLtWR+0IA5gPrpJ8E?-L2X6}3es3snq7O>sCMU<> z0hwNYj_Hk@n7TWxQESWn?JlQ~MgX$N;p&2DL5hV!GfWdM*E7#nbK}vk1U+uP?q5Ek zy0m|e_-S1^aA8b`2}C5he$=V*AjSuvsL*dL-ArEuUrCqLcqfpNWwLOgZq_wF+KX(E zgyg6j@9)=>ZP8CU3>@^-Ie|2q2hM z9pR36RXq31Rt4CvfUp_6Vj?*w1U2Do zI^4W|Y*IZ}-r9t^v!=9WXeX=X-W8cE`jCMI_lG*r2`-0{(Eg_%o4B>w^@6Nj8>1GG z0}PlT#Gi1!0E9?W8jxlw+*>1@-&%TFa+maPWxZwS}0^xRE2jga@P9|6hnqF|1 z=Vp8WAlmpb_bgsNTJJSP0=kP*kh%}WcVE0x-ib&65C>(JMi$pch3D2GXxE6}UXZ78 zbCj&MF*pV78CEuP;>d_seo4Slq6Z5QFlZtX$RO#9n?ZdO0OvsD75!1~=ZgIu7G9OHuF%=wlVY1|2A$z#g262S=SG20l3IT|TC zAD}RQ0!73?p2iSib{z8p_D1MKUE>450T>ZBq&>INhf2ve+#xk6QkMa35MEr}Mf+8X zhqM056g7kZwQRcs9kD_BmqRh}!&i8BNo33|zothFPZ=@!5#q5{ZImhSar(d(-)rWz z<-n5h{)DPyGVggoZ7~n6thGO z01@-abpl!=jRmToq2_g1MMOXAI@$oGtib%SqY1tV=O!HIQC;;!N~`=Zp-bAc#gks# zfo9V{KT-fNl6@)=g|BJjB}(yy^|mwRlFEOPfV2yZ!PFL0p zntpV1eHHkvjh{Nw4bk0ts(;ID)he9zAGaki9^PtKJ)zC-=u|MX;Y{c*^Esa8s%GyjD*stIq1$rZ|#*)~v4aZnW28J<964TPtwr zNiJ+un9e_o`RP~D6L-88#D?euVTb;Wbaavfs<4^yK9hdv`kXv1Kn z%VKY*Vxt}cXhtP828?;uklVA+XI?G;IJ1BORu6F>ioYZ>S|XNzk3;o#>vn5Wu+zRb zN`HEmjD^aLu9@cf%k0N7;}H-OZuK5y;}?V>H60bv@dw{ApwsRx?^SPlm-2mZ)7hQyT}B79>4Tw@I^FSrV~?ZdpQcmpLNCW z_;%5#`c?o*nwN^_3uQ|fYf5pjH}22-oMxV18`KaiZ@f%dSz3O>8~!A(BO<-$_Xc@m z48!<~%$AQSCp4ma9IttJ#-*BHz2xCah*kG}_}FNd-Jfn+@p{5iSata|Y*X4)n36rO zhG^!MJ_i;$CeWKI!L$OwEg?xDdxQU*e%*fNVp+Hi; zZK-L%Cl=vPeS3{v9}LU)AVKM*|Hk&oal(JKKyV{ zOVuR^<(X3;1|&kSmEUU+e&qkTMV`g#R4a+py+pz%qJBC|a!EZcOB&Fw|6!YEDTRwl zKyWHtN1FmY$P;6(3JiSnsLH_YrJq%94PzvZ*=x6pz_10Fy)>UgL11jO#Q+?TE$q*u zR0+#liQm5KHSQw%`WP8t_-65>*}`mvQE;msbUow+M-7*%REgxYW|!A-SF7 zD&(C>y)PDo7ip+8MkVBYfbwqq<<&>k0Vmy%R`vOb^mb!5iQwk$hyJHo0%$}C-s!dL zQJxD0CIgR(G-7`CJn+y5PC$zv%b+WA#T)WLh2pkO^BxVnVTglPFOwA`17tJhlhE4v z8FCixm#Yrn6UM6xrN!auFrZC&_d|j9GskW4C<8kQ1Te{j>6E`X6nP_CcpW{ggQ+o4 z0gL!8ar8FJM>u7vA>1pkg}h+kg+x*> zoK;`V_^w*dJ!B=$SmoGds2e47_YX#y!}(d`6UaTwyQnk)2Pn=?X8g-8<^^hmSp-_bw zy>Dgbi%KDQfP*gD%J)APxi#t0Rp!0l=g|=bOyaG7Rxb#EE3JdqZ#5t)Qr|uM2IEaq z)uJP`vLMjwo%BbnB;}(>K)~gn+Oi6@8hO2Oh4;#2)C)?R{KZHP%irUM-lGG-)-0%T z^Ic^rRkG6+fleCwGUH!n+ zi!3fs_a&f@$~JDo?Wy;)*@U+e!BScVu09g5iFQE1^5Fp#Isfs564P?X(X`KpRx%9l zmKe;So*P9p`vDUafI6k!WssY~ebnR|ZW&?nYRldygSrCbPaXW}f@LBF$)A|5VygVb zejitjCK~+g{9_PcUbW;RxYpT5Na3KKe*UpbP$Ay2f7=JSfSmsI6CnE{?~_tN6y_NF z4>pAQ`3 zgwr~fJlwK*<1mRFn$0?~7X~3vBzeA*{Qk5O0*pah+1a;{{K5$&B>&zwhR7ky0zx>+C@gXr)y7FYag~x)&1f>Pp9xG(4&TLbRCj zw!6;jj1x*JTt$1dj|}t$!uhNFbA+Qgr+&3Rh&DcaYa}|`WYjR2T8C3llGs@x_-sr? zHPun=u}GJI<>aD#+`FA&vW(H|{l3F>4kbXkV0%XYPFi9Gug0mg9VhFnqnfMI0hO^+X&+>C@t_ zTvaFJ`fcWuA8kIuPGmcPQCNDQ+fa0{(PSBMd+1T!og{<;a{7ngMoK7tG};+UiH}dF zjiyMIETiIO=lEUI_y@hOl3g{6)$%7%x&TX?*Ni-;pk@1Q*$^-z3v1rhq>1F$&@Yii z`aEvbC^4_N|KWp0`A`LESdcRcGb{armp2*c(z(2e3135fU(zTVE*GN}LZ71?MK+pS zDB?b$XY8tlaq(t*m5NP}kiuI&d}|TyOR^+SGiA~mkyEw5fu!|g1nmyZY2Ewj{oJ*)J6J))nd#eM(O|Q;s}-{adSf=JBWuk9gCt8RKAVI2HLFbuodzFB^FmB! zzh3-)Nro(L7kK=Kaw27%8|9~%Lp=+&%DiZ^nK-20C-OlTfqUSD3A}3Q!?Tl?Sr$8S z!~$tm*A-lfbisGoDwy6e|vRJE=gxhxV6|CQMr{8P>&>U*i}$ z&~Gmzv1J%2@DsGHu1TmS>O-hdmy8JSTD{Y$0&e)CbzLudidZ3JFD|XV>$>i;yXk&v z4S|qR0dw#8FPa-C3rvWJv)X_fd@dX9*ImNhzo7E9Aq*4PvEdY~)EzVil~ocb7(ILv zQfq#p?Y1hhXnpJ3(0mm41*$Gz4A%Zyq7xM0!j9@ID|o)sI;WXL1~_>BEXV*Wc2Fmr zC5QWk$!WkNw7|3SC+Z`P=xz2G9_G6kW&=$Sgbvg|#EcdP6%Z@_GbsNt^6T8)$2Mg^bs*m24_RPeU&paA(n720m z6gX#%6IIkJId66R9d`qlQO1V?8C88(uFpdgI5s4Xn`aN}5>7Qe>TVN&n>gOQMDB1I@`e;!Gb*Pi`L@Aq}9^`em4sz)3{|i!$wIAy4Jd zVp;fX0PhqGr1+GUfVhBlPtoTkD~D`8^Z>PWd%VnqynnsXk?*!z>9H8+%3X#zIX27z z*|NU{_ayEq4>H}e_OO(eB8J=cZUqmwOU{oIu z!g@00OWvhOKn#e#l$$JsjHId5uRqbBz?X`S#=FG#Y`&FJmzfCF$hQUJNYchx)kA!2 zP%J2&Da1bcL%4{f)(9C*w(zQuf+oUN<|FfJk!{oni-{Wif`%9k)uqMkLyI|PrI1E| zKcg@@Qscfsb!7dinrDKPvImk`cAiPfEb73mw!OF6$@RrjeKUo?+C+f!=*2N@Aad|y z6;1C-WQNpOICk@o;-SR&_NbtDWzp1RB-*e?N9KJS5B!(pg_0>yiqQZWtswF(5(^P4 zd^c^?Cg-1L!rBDTP(n6}sTKX6cOeg+y{molAa>gOjH#pHbVi4*FhEGW{&zSwjjCen z+eLCXAqHaKakioKvj~f1YyzxB7thbXPLOGK>5UEq4M=EK66X`|b6z&KPq->Lc7 zY6W0KOVJ{nJwf_dw#-H~lFRwEsq1-f-{MWslfq63hy7LoE#cB7ZV=0ZF2qWd6|9*QRH{oKL=5p2@$4dkV={9}d zDbk%jjrKDelHl02YWI$b6OKw1gGOr+$Vm-&Jvqb)--g6 zF(K>>FZFBSs0qnTk{iZi{ip5fDa7x02w8HiTKE8?jD|!PJgQr*d{@*hx&4f|3`?6o z(RzszkWyBMDF$n5guM<|UNfKd(?4s2)_LVeMPgrG4K6LYx0 zL^}q$CONh*%t57Fff=D+$y=xHOxCh;#fE#X_{)6T?zbAJI-<{Q1#3?nsezw|haS1-^QWLSeXIY{d#ujCgRb8ghs{r_~V4>6L_HM$0;pr1GqQYjy?x&>BrrXE&_Tn}=c(J!VfIac~>_P{bB-=le z6>?zy1b@o=S8Wruv%7dXH8d{yv`I(AU?4+eX;t~ji#*ghNTyc$_2-8_9>>r_8~ABD zy8HOl11CPqvyniQv8-Ty8=6ZUUgJ%7eh&>Z4>Qa0C_8!E+Hs0LY-eWhk0$8Z1tJL= zdsXzw5(R&D~WF&=gFE(rF`(dwGuIWFJMi$fl5 z(j7oGZ3yHA$D?H6MtW*=I#56po-;(;d>ErLVP+^q>8I8}ZV$9@tCnGrtCaKkEW!3m zEysuenm01~B~)1XN2lx30k(}((q^6=kSX)0W6EkFoNvhPy%{!a%2fX&lDIx(O6f`n zDK>us*SVs&u?;<%(qEv%w06ngzOH@tPwDrRP(H;qRs<5@{QQQ!^r%WO?4S|x3xB4R zf~fmwinl{A8Iwpw5`E-yZ({7}cGHx1s4VLGUg}PmTB?5s#1#K(9EZ^}F?yO@J^FHp z4kFB1uRh$6@-er^4-Y_Iw{;mEJ=zlrW*u&e@~bvbs&JDj8?EM8wcG<*<_*ki7DF&! z5p#lITJa|!1NBa07> zf@#KJs*W$qnLpmeaBhPw`$GTk^?`Qu-AzBrt&-4h4S6WQB+QT7{wG8bU!dY7Zi;xH zdHU(H*RFdw?fH+l`LWH7qCr#aN*s&dPYZSpW?IbCCr2FEfb5U8 zcfZ+cnTgIF;pU$|)l0Pu_}|1%hTvEXWSsf?Wi9I|rkm0?BykoYWy-Ah&3g%>V3UQt z@o=BTB6*L*R_g+b)%^mV$zcAFZLFun8?qL;uGBG?A|Q(V;AOZ~)tmX>k&(P2n91dWWsOMyr*1EAW}nF@BXi=AMr0Ea*(cJVQ>CK(b0^`+QLxn4|^(U zDo%Fxr|i6(ocG)y$bTC%ioH;S0BB$hha6Qmd^AcG0H6S%Ps@lCV=B#<6PwBKE+JOx zzSPYgk`Nox4KoVk==oPh#cfOo07w9w0X-sXQ`&Nv&kRN%;h4c^q3|q^3N`fgG9P-! z>0=|?+^SqF+hImJG;B>|0Mvx26m=kh(tTzaOdSLRv-f06co zICrvR6!>?(WJU1rGE|L2iX>auw2H?pukm@txWtuJ2~CnbmH!H5(JZ^^UMBNxv#(EaQ|h5 zd$R+8C)2p&2Ln8Bi7X8u_0u-#>T(CqkWS8gB_lZOJ&0*qxC$ zn&dPrjg^%1xAYD#8MQcn9IPYRO2O$NF#y|Hj3=Syf71Z_YK|steyJw_OChnz^wsq$ zfBF3bi~Kh!!|i-4V2_ZwWUG2~U9j}qIOX6g`hDGhhmR;|H-lMNPpTi4R|JY70d+2Q z425$fPD}rtRlsf?qZqmcY@ zlAr{~0meMgEB@1PN3rM(8p@WTMQgJHcZzp=vVaYVxhdM7!2Yv*sU%`Rg`IGcNz(IrlC? z!xyn86^-<7&&gnjSbY}pNIIHUGy3tnc(ahC{KT}K{LdKw&2!8{^AbYyfOWf#l+>?N{MGmiB(la=zsPYkUGUJKfw(uHVyzt0N@d5W0aV!kOmsZ zCM|L%A4+ByEFcfcg~f+W;~e#zUZ^gbuM_KJS&4!0rJR2_-O~sv?2cR=>5XS-;IfAV zyaoU`M;}KQ%yC${KjY;v2YPC3A0K^A%(yfoYdnmLkuDd{Xe}jcT)ICy7A6~-nvG`^ zQVeziP{AK&=4cclM3evk46&3j7z1OKh8Z`blm<99$dqLG@=}zC`OwG%1~^bs{h^FG zWXi*gy<`DH&o@&1N1rnQ096|V{E0De8;b)_dSKa}b|i*dmVizcUwnkXWCmY;CXV|n zH_vMo)j@pKDHYXuB6-ysI(d9~`Clrk_~NRBsuS_@s?|0l+$P^tRKF9cPSu#q6M3u0 zyDV|ZYl64aAk}3i-b-)VMmOOfR`LXYSn;aP)bPA^R(-8%qN$>)>1v{RuBtxmB@0rO z<-ZZCs@AA}JGD`b_gZmQ)m1n7cCM;P;DYF(BXERrlN zKYuAmVkjucFQ~C8C@I$dyj}3QV4%XRprmM^qO`EYdJm+Qd?~14DJWnmtSGuFVA-qr zQqWL5P*Ij#Qn*)hh}p@q*I-{zQc_s)s6brpK62u1N9vk=r zqM6jp2=HeR0EK#sKpD!^P2~(#+NH`?;Xt8wQjqB;i+v?yNgX@M)I+5bA>Ee}gC}Fo z7(1?nnwj%T#ws&*TFI(BchYd5Dw{~gf;Dzr%QC-bQY-9%5tMT)+jv+SJ*VoP0J7T3 z$i@+q$;l>=m0?vI0)d=0{#+_Q8&6p}zZztflT9Qm!%;(^ZObuD2KLCt)0SrJAyBqq z?MZsnLj|(xzZd>T#zsOc$STo4T1KWgE?Q|QCFY)$e}s%QV@2hGQGUe4oR<<0Q4`nQh?}g`g z6KO|)!j-Lfa;Git3EDP7(@9P;#nY2Y;UK}trgvQ8RK|+$!hw9BaCu^RwNv)!L8M5FL!YQ);R1I8p;D~@I z9Ni@2ehImE+vmYb!_pQ|$00r@bg>~m`g}(@F-At!q339H)x&&@jNQ|GXmmM5vP`Vq zYF3Pl;4E0dxZ{u8qR5AILol#4(Sets7xz$s>kbM@4$OZPmQ7#;rOAPTcF7?y0(A>> z!VzO4F&ci(z!>mKhKVr{DkDvo1BSF1WMDjJJsPV)1`g=&I--wdh{X{^<*dTV^dLY^ zhCbgH)M&8_2!)*PAuY?|s##IA;=pN6Svn93ro~+eTFe0O102wgKkEn`5QPee!m>cQ zd}dI?A--)gZg6EJ3&3ION%6-KLn8!-0Y0mS_`nP*1`@z{FVi2)a$?8t2}&|MRA3!r zj`KYsRtWnKmrqnE^puy_sYs0}`yh)&sx-GAdApNGi@t z4?}0-HvTgSI2EYIFpeMs!%&W`lox1>-3efflMA~KJ-~d+zL4Q#paW6D$Oys* z^ypYEnM5ZgB__I@`1_?}QcH#vbu!tjjTnY3~m{AevKw4Jd(5+Y*tEUaaszLpOE5x+n2cBsyOkmm89)L@g zIRwRJS9Xjo|FJbS7;KCE(f0kuKnb)(#ywi7U&?@}y2l800BDB4bpcWTRR`tY`U@=( zP+Nc7#l8~z11+>nu#S-&1R2Ah5*=7V{~N&l0b>9j7|O+hod4Fv;(;>$gmU(wlX-xgM?|m!?LKN|S6@Ii$n>9dV&Arlr_{zLb27qG$fWxfi9^-T$ zRd-52ylg;}Bh>K81Eo+t$#N4Zl5W^kEJqH3vXa$yiecDm#Z)61j?SW3H5rDFe&dcs z)viO}9+Cc}EZgaLF>n^xZ1yCVT2X{jVqTv4cwr^Ll73RdyleQ6w! z-L;NH_lJC+p`rcVsv!L-|J@RcD*PqiZ;9{4&^_}XC8QY~`#L-~HrPKfGTt}UKQY=j zGB>=A#5Nl~I%8ZF{JOpAc-1=o?zHvJY`=s%KkG>?Fjm1znxyKPew((Bgd$-tSA>-X zuPGQ{6QA@`5)J?KB%33WR>d{HB^)(=FtU|5(i-cE6GKSQtoZ}qh;RLKI^VY|#|y?N zzaP;2GPJ%7%&(#zQ)i5plD}YIJmY$)P+Qtn4G*y3Vnpgv%yy2-W(}uw)`L>^1EQNFF zhv?iWA2S8)%z2}z(K#~+`m2x~x!yq~LW>mYzHTca0xja6MLS%JP|0rgiPuwc8*=QY zb6s>M{ZX$7O7LzyL@qe)#un~Ic)f0K3pVt6<QX}+?$9MX%>-Z*(yUYR>bVlnVH#+Hl+E7YeMnl)d&7mrDIAv^t z2NKQe(|V|!t6HFge7Q#9x$V<_)^8h?@w$@CP)BNpSczMuq&*FBF7?Bi-4Dj<{MpjY zC8srZw5(iZ50~S^qpiNN87|Z^y-JEHO(9m#{P;*GiW?tjQROZft2i%g@mv$<^y+0o z_H*x;wc<}sev3EE9#~1gcIvPE;t|$)%Y~y+@%~cj?%Z7T`zne&qSw5D#MaO@E+9OG zuWakIxp&eC(P!Y&DikP*n0sgS6%9*(^Ou;w<=oz*oU;!M(AcsWVdh=L#Y1{V0FWXt zCh4s4Jlt}_S5X4;C-XPR=ynb8^~FMcwwAd=!&4e5ZXY8k<$l2eTrlt6*Z~AMs1P)g zij7YX?MF69Q?Ep&o3()LiR8{UvBa0vKt?{Ce%1(hqh9nG;Wj~vfBlfW5BaS)TU3CT zp5$}u&&Ld|7wO%pDck5jsR!pu8KSeYx5VG`UPGs9rIyBfOqZBZt0zZ_vQ zTSmcCsrFrT$6hpEACp}3dIFME4T?~016a-diqF2{NoRsU{PhgLWyu!pqhQP%T4(`miWmd|Fota0TGP-X@^4T-!)I5J2Uc1|X$ z9}m7M#!9h(u#-a5$L#k{iNqSE(z%$Ec{}!WV!AvE3hF1yS;x$;GysY@Py9ziXRk?E z>LL@pS>djaG77mF`?00JVFVT7qU_Wq&ufnine4c&RiAD>$K5)>R@ba7j%lM&+Z2yc z{?IKI$3zJ=6(9;w<>~g;c{)ujcUiL09?9~MAkXPvBWoHR;Whb4Vi`1n$L zTx8K>HAqvXA^t06!=#m`+7satiAk9QgAcwg9~+-ynW#B%OaW0M=@@B&o)0zbmE=SV zH9OgyI=aexNy3qgwgMIC8I$Kbe&eph+EQl7PXcX?xpOwMw19VF(;R)(+45P}hp$2? zwVt~zIFF6wnoS|1N(zbN57W{Hdn?&+n{J$9j-8K}nci(5yzehkrXO6M((0|W1c2|m zcVyPloeCe~l_Mk}sV(U<&mM>aOcQkCsacsHLJDQSg7p zCR5$V;K)>rsdmDZ3Y_p9NXU8&;bMrP0DVF?zqdk+fQ#;=QJM)BI{Pok@VQ+m{!F0I zY$n_CZdMnsD#Zr~FpZ%ZY1HXgd+Q>mVmGs4hs*nP4WjU#ati7-1_d^t5q@={&QWGQU1bART^mEJmE)@A$-)QO4cJM zdZ$;Pq?QDMJeqjmV3vNKLET933V%&N`wr(#e-lpfBT`ObXGRYhr9&gaPIo>sGEqUNR+hSO(ruhjg-ztuhg&=aBZ)6Madx0Gt#Y% zcmR*DqMYE!cT{MwBP%B2Yti|To0aWc!$RuMtFxfqM2+RJJ)2}KcQO$S;?((|Xsqb7 zBLiXW4#A=7grA;Sr*21*b0$w;Rc9^b?j}K0Lb*4#UIay9Ol3zR%|4jfU$TU3JMND+ zY<(>$fAO|*f#-SGx-RsZd;7PA>A{N%?K8WgAHih1>gKL+u%-27$7Dxntf z&#U_reo{z`ES=Jklj@rj@stuKBWO?ia6ts)k_NjfW0=Z(&a-FJkry=^v3>IFC9^&Ydf077 zTYzGu7Xh~cvxI>P!1h?F0;h}~o0ekty3Fzpr|~i47`J1+a2SqX#4Md}`8DrPZFDwb zeT?X~*|HNW{^o`@v#T~TXvPAJZx@NzY&`NxzRU?6w3(F%U9t z8N7-QncUk_JPb?c30Z;JtMCM_U(bBs7$N||bJt(#=VwEH=~wD8j0=A%B)}pPt+rVs zjijwNz;I2E$GtuFv`tbk>3eS#BO*DTQ&fAR5FcLDd$N38*Ni%J;mqIwb$~B(o0nhZ z93-E0IN3`YsUy~(StjJQRXqkWOc!cfd5skzfUO`87N@`Gt;0c(oc5T6Zqc;ASgOr_ zKcOZj1S+;Pc5Y@?@i;O$%g1ATjsa!Zr+311%8m=*Zq2YzpLG*$=sk&VkZ2XIsd}LZ zpy*$&zWQ`nmIFNP9iy)fz`+OJVBDxBhbv}5$1>F3qw*~f&GG@vqNf9j$-^2nIZ>Ro zk!}tR-UIWa3B7zTWYtLALe>#~oh=9!&+~8vck85=Ht8%k8*GT+`n?jjjO#RCbe_8% z6^1p&bOvi7WSd@=&@Xu|TPS=DcB#lkoM=twsr?*68S@DJ3ypyqE(uD8Kroel@0&-$ z2w2vZPtOFc%wX)ao)gHwgb?7DS0)jo(pHOvZL&9bFmSsdg;?qx(@N?Ke!J+3$5Q{X zzfoPj-*x!gWUJWi6Iuu+pd!u0E3<0`GG5M%?gP=6j_e~4 zzTO%i>SVhkOE${Yj4-_`N!z^Z_{@IlS=6iZ<}n}_m~FI z8=cxva^c{qUnQ5S#;uJf@IY1UeY*=;XsU3BWhpD7tv+e`k3QWkA{npX@T!|atFF$r zJrb>>=y0@77L!9?FSf?_{j1HKoaUq&lLi-AX43EjPLz>y-zhQJ@CnrDVTu34O*1sX zBgCCt9AjcTskXRyUj>Np-gTr@xr|gthL*wNH$l&2N*%ZTCxFEqt&-7$w{JQLewpc+ z>A2gM*uc6Za=*`e`!Uh8yt5!r&)<)Aj2jWm5&c9~jaVT7+(Hn`5J&&p z10Z#vb$bkk)So28WvU=AK1L#|ihAL4A=|u=Lb&WBjZHNxTJJU#q*niWgW}cjXVQ$V zBP%L~jEoT6>vuey)y4?kiPy#MSeM75k1p5k6$fLkc@YRphHF{f6w1XsZuNKDn$5KL zC#=q3c;7HdVn);}5+zQV%5zD6cZObaVw`;}PpQvIdHh!5TO-?q3K4p`+PYP5C#gSa zCq`IcvQLy}qgc1~&@WT_1T_4kY+6Q`!ba z?uAw^&P{L40n2Mf_3qDXU&jT(uDTZK>EEc-4L%Y5u~C?phG~V)9^t-)vp-av3D0bh z>@Vm;^5n8b^I$fnf4uoQELsL(yAztz<^p+>bggcozuV4@X;$nxvinQ7!U6hafDQ08 zG!mLG7c=p(ZG6^x?tV7dKJnehxR$ax#ogsnO2kFeYWI5yh1RPhpMjKRJ>H&zpDeL~*36>BeH|;1~ms9T0y#uA&|_CwhU+_15Ed^`}e% z7fy&0C$Gn?5EnI8{hZCN1R1i3{X(5APR$hSYQ?!XqvKnD#aqgxe zbYAkt{s;P{?d3D<_J^Z#lo%-jbK>ZNoHBK{MmV3n+6PxQI}-G7d)Xi;2<%bMUseHO znWqXPq?iE9W($jvLRqA;3>x4bc{yRnL`p^j0HxU@QmTkiH}>OjTW2&;f26i|H(Uii zWJ>|x1Y7ro@6JYjlUucG+7T(xJy#+KSEth-W8?T54S!XY(uP2bAkDCCM{LGao3Nbk zt#93hxa^EB7)_SA^K4W4-C&*qTqm}q2{rgn)oYhXQL-SSd{@M3_zllxi+jmNQV^ot ztNKvPe-zc5Yzy>WUnWi^kLOA84%M6vc9Gc#zT2yW^F{jMz+KNM0C+vZ=a6IwL^Kfs z`&dPngOvh-D;;m*G3z8nxn*~$XdyYQXRY`x?a(G- zB~_(IT9i|0?Z&9d17XHmqoR5UY4x7=gq5Y~()L(&xL4a~vyX6Jsj5cMRY>t>J15wl z2&gaRuAYhp#k#$aziKrNw8hCowexmC)I=_S=G{VLx-#VBy6s>NS4OH2oo5yNo^r^Q zr=g`h+hE0{mg4&4(}$bA{lQ!pn^$&o*DoW&tcMKDddd`%l((bDLb99DyEKsAN;#)) z#UL80h{`ujyKw*7f8yg}Kjb3Oih3}f&4rnfx~ZrV(hF02jtn8gc%ehBp!Hk}$UnFX zq~7~1ydEQzJMnSS=Sk;S?9kcagAIOQQQB+H<%|Ua-)Y|rz}J@&jbomW5U=|nmzg;= zo1S!6Pz-zO?cr7VeC~tx1Q&Hy(be-$N;xW;Q{hl64Kb7NlnmP2un+w2q>Ig(OkpKI z@K>2rIo95JRX zJac+UqOTXNlIMswlvzvmOHZB%#1JmWs6}Hg<9+Fbd7XO%67YXwb8rV(*UyKOUZPiN zT^TBd_Pgt*z1g?2Y6e>NtW>Z*k>YV2Y(e zLm;g}P_p@0sOL1sgIBGmd+uB5`$$g%ihlE5j}}^gHg7H#1|Qd~cUPAvvzzkaBEf9V zV-JFU=fMg%apyfzX_K5*_~K_=iJ*&G2uQb^n(=YBAB<4h6?3fGd2^xK(jLlo20R=x z(lQbRQoJ)i9w;%W+0{a~Jc#5}E()r&RM?5W3f&BMmg-ikI(IdQQZG;pyB0oLBZN1~ zxRUiu_XsNZh*1Vw5cW+kj&6D-<875r08(W6bS}W{vu5M#uUY{}1*tQr3%dY|ELCyA z!wuT5;+(Q>qO+6B3!_FRrK#`VZyH_V=Y$5edQNk7YZOmd;`+e%bk%JeZi!8VwabhB zQQi#>U;JhRz7&j@ZfqOiE@*71bbQ@rPd7Tf9Dp7)Wipo{1IHx zL8$iWy&iL8{6|&kMsa^GcLSym5k8dYCoHnapSpe?Clo9?X?FN)yJfJss8ziT%0k;( zH@n{PtETY%Q7~lc(=5BYhS14UyBm=pHdD$DP z!H|nMM79&&D&h4b^_b)352#I_NTFa`a&?#VUki-9oLm^O$YPI3A>O;s@bdzTC8~=;E8@$pbk3P;g`@~^fj3L ztYwnpJ#NVO#AklK2dOO=WtN@`Lu{0sg(jtf&x(c1t#NH8o(D16oP-%?(G(G1xWDO@ z$cU?96I~70dAs*rdOuJv1lh^f1XQR->UC&I%03!pUbD$r*3i(ijkvzk^X7QB+}_@! zwIcZ1NI{DAD_(mj#g+{%ku|Pr+^$m;`l=OcR9UK+`giVL{Q(L7LP_cqroiRv4hb*! zt2onXgYwKcNYb}(t?#?h5~VXCzFGx^=O>+E7(%sQf^FquSz9#`&zwZvsBxK3&Y9Xi zj|@rtbYhA%%ob7S(d&GACxZy+W0>+l0LS&lodtxb4m0GFB|j>}fo5q^(SacA;Y0Rs z`2@v4%kS$99wX)B^fvddYeb+8A;W5d_EMIg3Q_CI%k0_%#I zPF33pvALM}2*g+iIo&3gI+xOK=pAoyzwgm-k5F%9?otRBX3vn%con}VQ7C?DDD$g2 zUS5)|S zpnMqn9zAdE0o*Cq=M8xb#b-U!i?EBYGa{1@+3OJP*YI?>NCdUN5)WnYw@|_Q_GzgJN)n`E4ibK7G+5E$huvIa@Uv5^k&~k?^ zE9mB^Ub?;=i}z$1a&S0_0&D}`-#mSrtrae%q&K|>N$6%LI?t}v%%O#ae$M0Ecr}l5 z)&ONG^K{c~X*Z+GIO(obcGl86vmw1Mag(Mt$F+3z){_uxnKegUlIdU)fEVpEd8p+a z8O5BY)29oP3x}E9wg)fHiQUH1>WSJ?W;knJK1YlC?KaMLzo;iV?F(b1~SEbgwi@=HKjdKT!(R*bhrL{gUBOn^_uev6#mQd&uT z;Ox+JyKCtg?byqYu~;d)xBPgiShePz3V?mX{rae`=Bsm&uHMT$I(S!OJ>y|XN{9Z@ z!IJv%Cp4pqaH^UgN(&MgPWCBy-8`Ax+{7^Ea{S}9M^?VkzFx**hVYuii&(Az=|>Ru zMPU1Yb$&iBY8qni^WEKX`@J80EEE~!@Xt|(lrRxQ^w2;`l*eLR5gcW?yIq!QlC9wH06O+i5GEe#I+Aw+Rv5 zXCn|7X)1&4R5l1;j#Cye21K=otXGJ?Z5;5=_Jn~)Kc@_68l@NeWvLiMY`s12YcJUx$eo)==tL8C+m}^7e2}#;DXn^%a zfY<1QjzgKX{3_@<)^DJQD?2cZ7>CYy|09yY^!Ivh_)|gWuu#-Asq1lytB`qF^!WLh z%{8T8ox=_SqxNv_ez%v60D)Mv0>ctQg(o*wB*oYMiNlueXiUXcUP@F7!G~E&g$~G5 z{nDt*x9syCyG1W#@f7WL>pxN(V`!Lel~Shjx)uUHF&L9u32MGwcCH%u;o@!EY9!fo zxH#Raa03ebjOp!3d8`$(H0S{ULM_uX<4FI@s0+3*L zHSsWQ2{OLo>rYlAtQ(*DmKi&7d*;(_jXYp zLNy$gH@s>QI3+pz$0-R-DElAI90%dxeqJ4`BBYauq zhzE+;S|pIBg+|RxeA1nqJtdn6CokA(x88ffe&yaa-S55?mZc7sj*flaf*)R@ zO>tDJN#zDu+8}eEFm-HBF45952fj72i`i)cE&zqbbyV6)sa~m@;nua@c#0wAkhm9H zuqnU}6ao3fR42U4((Ee)rpK3jZvM9bcs4)tl`aCW z5@dOhZXY}q1?bR?_mS{FZrbjNAf2`S`vL+hnKgWa5*dt@pQ%j>m zt!+(38G;lVO)=8!-M2e*hp$ubWYyl{8onjTAckX!>P=(Ycex^~pmVg5D>KzFPBb3Y zI$1nBN&YmpcAWZnhhZ_`?P$ud2voTpQyk-{TL2Ihy2BBLB2y)Lnka31yq{bH>MWd- zxKQuD$=1fdQ_BbX80WWkh0e%f7D%sjpPi0uW559Tm3s1i7=tzhQ3DSE-oW*?{gb)d z1mRaj-eQs7s86d1qGIv8A#Wg)_VuX~f(%*g+K^660O%v9SzYioVMA8AELAvn%K#WI zbJ`GFG_EZr*fno7x*JaxM$lR()U6WnNo$Z`PG3>#z+g3rN(($zH4=H#a<}Tx@22iE zuvNHOimRUfeV~i?j7<1hZLU@vMp0bB3Q0f|rvxH=>itSUK4r0kS_<%FRmzEL5Ifkd z3Lib*VDDx)v7I`a_5Iz?Z@9qY#6w+(eKXx-APC6N|ANT#^8qD3l~V~W02|!f;Ig>9 z!>mxODBZqjVR(i58OZ7#!pYM`>_bhVT|vUaVtpp^x?ds+t#0HDsc+d=@X|YV^b$ox z0Dj7mCM9T(&pk)k)2T2eyi^{g8t?&eGCTTMd2hqhlwohn$9qmNR_lA~C655kEmtp% z|BDXwWJXeA`>pP>-r#tg=nv(G|!i= z&?S$~n|ae}J-^J`nCYkW<3_<)n8i7xNY$LQ8Kw*-+6qx}9EPq&Y@TH$j~$i2@Mv4H zuj+DZ|L~Odo1Po)0BudW?=K|9#=v}6CEYat-@q$Q{))&Pc!d%*H6n{Z8WWuY#Ku%4 z!OX(VsbkH7hzhvv6YT3}B;q2XbDLI{@t$R+zlOg=)#ZQ8F^XB zzx3;!eWTmEvbu+Ox%9Ffi$8uf&GA52&r0XIui{ZS1&}S1rimLpsfUVWLx}wFc+Mmj z=6`yo+ZRW+6dsr!+*%R<^*xOFRZpqcx0z+BU7E*=N)Cz!p+$t=yuO5b=5ItN~y}w|# z;(>G!%sUXh;z$g>ET)hiZ*XshddL>nJg(niY`fSD1}!$phb<~mRIUO> z!rq8aGO*Xid4_G$jFi39fap@@>C75>v(}qXS^W|sdo&ehar5r;i4R$b?DUc|2HJx^ zjiwY!jM$^UEkAd|A40>ZNjAz~^;YqoM=z_{m0yNXXiWZq9=$qJUuq_8)oelyqM(0> zmY|kHK|)0b3BXd8>j{fW4d-Q)I^MXGeSYS9p1iqtcKS6r%-S`s3B*P3J$Q^k=$(nw6*R-I%pv*$X z)<+rTtvuVBHGm(02S*OiyciqpNOyQWU?=<=ksbJg2OdF)S`yju_d`gc7^PQT^u1CW{| z3cdl7;|mCFob7p5&)Ib5QhqN6H}LDeW8fgqlcz|?p?l@Ntfr+7Of3d9LTf6o3|gtEUC6vE7ER6=lnKKR#gp8O0 z9RyL*F@OvqO?)9{?P_oD!2C`&(AzGejNpn2av}?u(|6S&L}3DA6>o?VeGS{tq!vEsam4Vpt@Z@s)Q|bbO2P*5-elUF|FTX7ODseRN zN}~He&;b|Mp@}%T$R~&ifVJ(Ls1G;*+!FpWU9Tmz2Cf>4G-N?H2A-w6cCxgcMonN> z9PAfT52p#&$7qAvb!8%yR^|a65`08O@-Vizf)`fvQ-)JsZ#AE@qnE~X#@r}Z=bj#1 z00SfSMb=}^*NN1ABij>MAcE8Ps@NiN1sEIKDX>yZ;|$^ zkWR}C-gak>R>Wk^JhgYzUmE8zWG?cZu-m{shu0d6DeqAh&4W}(Xn>$pv z#+weJ;_vL;{wT%!{u?RHTot8VtbtU!{%h-p7Ypyu%_`r#AO4m7vC(cPsq)R2F*)-K z_ZdrT{=ytgEqtbnAZTdx8f@_5k=eNL1EaTxw)*v|1o>p#wYpQlqU!abvEE~(1@_A6 z60sKL>~aj?p|KCKzGO7*si%~z|j9&RxS@fU9kg!+b06&IU|&OMY4 ziP}HMd1bQN8y4eB;)`4FMHVWDR~JsdjaEqGYSWL!`_-Uu@&1|Q3!g%PgpGF8lNZd% z#3kq2#qk}JJYMzGITWAXLk(YO8WZJ2(ScXGC8A#SwlJ(brl7pqoDMp+EJJ}=Ts zLa+t@H_1g!m4b(03c!tgg~;r^0M)Yh$$+x5as?{TIZ3eAu#C#iLs$B+b}zb3!IlTW F|34+iz>)v} literal 0 HcmV?d00001 diff --git a/sound/vore/growl4.ogg b/sound/vore/growl4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5fb3c2db79a63d76e5664f95abf185c9ca17b01f GIT binary patch literal 27683 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%0DX{17;7vrq!9?ysf5WT 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

    LN82UIV!ezfkLq=I%X>&(QiV4`D5YEO`bj1C~VF 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 literal 0 HcmV?d00001 From 86955844b6126ced60c6c4a13f1883f9cc01cfd3 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 27 Mar 2019 23:04:24 -0500 Subject: [PATCH 097/142] Automatic changelog generation for PR #8169 [ci skip] --- html/changelogs/AutoChangeLog-pr-8169.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8169.yml diff --git a/html/changelogs/AutoChangeLog-pr-8169.yml b/html/changelogs/AutoChangeLog-pr-8169.yml new file mode 100644 index 0000000000..5c50eac652 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8169.yml @@ -0,0 +1,4 @@ +author: "Poojawa" +delete-after: True +changes: + - bugfix: "Normal blood splattering isn't offset due to tauric mode" From 34ce97ef3354bec3a8dcfb2691cb871fe5f91513 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Wed, 27 Mar 2019 23:26:33 -0500 Subject: [PATCH 098/142] flip it turnways --- code/modules/mob/living/carbon/human/species.dm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 61b6ac0bec..3f3c2cd548 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1143,14 +1143,15 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.add_trait(TRAIT_FAT, OBESITY) H.update_inv_w_uniform() H.update_inv_wear_suit() - - if(H.noisy && H.nutrition <= NUTRITION_LEVEL_HUNGRY) - if(prob(10)) - playsound(get_turf(H),"hunger_sounds",15,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED) - else if(H.noisy && H.nutrition <= NUTRITION_LEVEL_STARVING) + + if(H.noisy && H.nutrition <= NUTRITION_LEVEL_STARVING) if(prob(10)) playsound(get_turf(H),"hunger_sounds",35,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED) - + + else if(H.noisy && H.nutrition <= NUTRITION_LEVEL_HUNGRY) + if(prob(10)) + playsound(get_turf(H),"hunger_sounds",15,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED) + // nutrition decrease and satiety if (H.nutrition > 0 && H.stat != DEAD && !H.has_trait(TRAIT_NOHUNGER)) // THEY HUNGER From a0f5015b01f8c79851c4a226d0b698e552cf1f55 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Thu, 28 Mar 2019 17:05:24 -0400 Subject: [PATCH 099/142] Update shuttle_loan.dm --- code/modules/events/shuttle_loan.dm | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index cec897a61e..466e28a3cc 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -6,7 +6,7 @@ #define PIZZA_DELIVERY 6 #define ITS_HIP_TO 7 #define MY_GOD_JC 8 - +#define DELTA_CRATES 9 /datum/round_event_control/shuttle_loan name = "Shuttle Loan" @@ -118,6 +118,18 @@ P.info = "Cargo: We have discovered an active Syndicate bomb near our VIP shuttle's fuel lines. If you feel up to the task, we will pay you for defusing it." P.update_icon() bonus_points = 45000 //If you mess up, people die and the shuttle gets turned into swiss cheese + if(DELTA_CRATES) + if(prob(50)) + priority_announce("Cargo: We have discovered a warehouse of DELTA locked crates, we cant store any more of them at CC can you take them for us?.", "CentCom Security Division") + else + priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak + for(var/obj/machinery/computer/communications/C in GLOB.machines) + if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) + var/obj/item/paper/P = new(C.loc) + P.name = "Cargo Report" + P.info = "Cargo: We have discovered a warehouse of DELTA locked crates, we cant store any more of them at CC can you take them for us?." + P.update_icon() + bonus_points = 25000 //If you mess up, people die and the shuttle gets turned into swiss cheese /datum/round_event/shuttle_loan/proc/loan_shuttle() priority_announce(thanks_msg, "Cargo shuttle commandeered by CentCom.") @@ -147,6 +159,8 @@ SSshuttle.centcom_message += "Biohazard cleanup incoming." if(MY_GOD_JC) SSshuttle.centcom_message += "Live explosive ordnance incoming. Exercise extreme caution." + if(DELTA_CRATES) + SSshuttle.centcom_message += "DELTA Locked crates incoming. Exercise extreme caution." /datum/round_event/shuttle_loan/tick() if(dispatched) @@ -291,6 +305,15 @@ else shuttle_spawns.Add(/obj/item/paper/fluff/cargo/bomb/allyourbase) + if(DELTA_CRATES) //Delta crates can stack on eacher, and are basicly a 1/3/5 bombs + for(var/i in 1 to 7) //7 seems fair + shuttle_spawns.Add(/obj/structure/closet/crate/secure/loot) + + for(var/i in 1 to 5) + T = pick_n_take(empty_shuttle_turfs) + new /obj/structure/spider/stickyweb(T) + new /obj/effect/decal/cleanable/ash(T) + var/false_positive = 0 while(shuttle_spawns.len && empty_shuttle_turfs.len) var/turf/T = pick_n_take(empty_shuttle_turfs) @@ -334,3 +357,4 @@ #undef PIZZA_DELIVERY #undef ITS_HIP_TO #undef MY_GOD_JC +#undef DELTA_CRATES From 7a533ffcb740e6076befe5426031c9e0b7ff3085 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Thu, 28 Mar 2019 21:22:40 -0400 Subject: [PATCH 100/142] Update shuttle_loan.dm --- code/modules/events/shuttle_loan.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index 466e28a3cc..37383d6ad8 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -310,7 +310,7 @@ shuttle_spawns.Add(/obj/structure/closet/crate/secure/loot) for(var/i in 1 to 5) - T = pick_n_take(empty_shuttle_turfs) + varT = pick_n_take(empty_shuttle_turfs) new /obj/structure/spider/stickyweb(T) new /obj/effect/decal/cleanable/ash(T) From e45181f670f08deed65b7f4da237af730a537796 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Thu, 28 Mar 2019 21:30:46 -0400 Subject: [PATCH 101/142] Update backpack.dm --- .../code/modules/client/loadout/backpack.dm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm index 9f12dd8b03..d6f4819d02 100644 --- a/modular_citadel/code/modules/client/loadout/backpack.dm +++ b/modular_citadel/code/modules/client/loadout/backpack.dm @@ -72,3 +72,13 @@ name = "Box of crayons" category = SLOT_IN_BACKPACK path = /obj/item/storage/crayons + +/datum/gear/toykatana + name = "Toy Katana" + category = SLOT_IN_BACKPACK + path = /obj/item/toy/katana + +/datum/gear/lumeyes + name = "Luminescent eye auto surgeon" + category = SLOT_IN_BACKPACK + path = /obj/item/autosurgeon/gloweyes From 1dc121e4071513592f9cc0cbb789ac9d452e8b7e Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Thu, 28 Mar 2019 21:33:21 -0400 Subject: [PATCH 102/142] Update autosurgeon.dm --- code/modules/surgery/organs/autosurgeon.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index cf22a633cf..787175e05d 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -82,6 +82,10 @@ uses = 1 starting_organ = /obj/item/organ/cyberimp/eyes/hud/medical +/obj/item/autosurgeon/gloweyes + desc = "A single use autosurgeon that contains a set of Luminescent Eyes augments. A screwdriver can be used to remove it, but implants can't be placed back in." + uses = 1 + starting_organ = /obj/item/organ/eyes/robotic/glow /obj/item/autosurgeon/thermal_eyes starting_organ = /obj/item/organ/eyes/robotic/thermals From 76bf11b94cadcab9cb443d6e0f23388af630d5f1 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Thu, 28 Mar 2019 21:35:54 -0400 Subject: [PATCH 103/142] Update backpack.dm --- modular_citadel/code/modules/client/loadout/backpack.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm index d6f4819d02..b503779f00 100644 --- a/modular_citadel/code/modules/client/loadout/backpack.dm +++ b/modular_citadel/code/modules/client/loadout/backpack.dm @@ -77,8 +77,10 @@ name = "Toy Katana" category = SLOT_IN_BACKPACK path = /obj/item/toy/katana + cost = 3 /datum/gear/lumeyes name = "Luminescent eye auto surgeon" category = SLOT_IN_BACKPACK path = /obj/item/autosurgeon/gloweyes + cost = 4 From f006c1e16aafaf4b8c8819d5b25521b536a65999 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Thu, 28 Mar 2019 23:20:25 -0400 Subject: [PATCH 104/142] Update backpack.dm --- .../code/modules/client/loadout/backpack.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm index b503779f00..bb12fc8ac9 100644 --- a/modular_citadel/code/modules/client/loadout/backpack.dm +++ b/modular_citadel/code/modules/client/loadout/backpack.dm @@ -79,8 +79,8 @@ path = /obj/item/toy/katana cost = 3 -/datum/gear/lumeyes - name = "Luminescent eye auto surgeon" - category = SLOT_IN_BACKPACK - path = /obj/item/autosurgeon/gloweyes - cost = 4 +//datum/gear/lumeyes +// name = "Luminescent eye auto surgeon" +// category = SLOT_IN_BACKPACK +// path = /obj/item/autosurgeon/gloweyes +// cost = 4 From 124505a4fb2777233b28d4e210987a42a81ac4bc Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Thu, 28 Mar 2019 23:31:13 -0400 Subject: [PATCH 105/142] Update good.dm --- code/datums/traits/good.dm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index bd55869c99..cfd8f95d7b 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -156,3 +156,17 @@ mob_trait = TRAIT_VORACIOUS gain_text = "You feel HONGRY." lose_text = "You no longer feel HONGRY." + +/datum/quirk/trandening + name = "High Luminosity Eyes" + desc = "When the next big fancy implant came out you had to buy one on impluse!" + value = 1 + gain_text = "You have to keep up with the next big thing!." + lose_text = "High-tech gizmos are a scam..." + +/datum/quirk/trandening/on_spawn() + var/mob/living/carbon/human/H = quirk_holder + var/obj/item/autosurgeon/gloweyes = new(get_turf(H)) + H.put_in_hands(gloweyes) + H.equip_to_slot(gloweyes, SLOT_IN_BACKPACK) + H.regenerate_icons() From 18247f28ae4e892f4169986adfa82bfb0f569f72 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Thu, 28 Mar 2019 23:35:11 -0400 Subject: [PATCH 106/142] Update shuttle_loan.dm --- code/modules/events/shuttle_loan.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index 37383d6ad8..769e32275b 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -310,7 +310,7 @@ shuttle_spawns.Add(/obj/structure/closet/crate/secure/loot) for(var/i in 1 to 5) - varT = pick_n_take(empty_shuttle_turfs) + var/turf/T = pick_n_take(empty_shuttle_turfs) new /obj/structure/spider/stickyweb(T) new /obj/effect/decal/cleanable/ash(T) From 30ff894398adfbcacc6a48bee4a3c875c3412071 Mon Sep 17 00:00:00 2001 From: Zandario Date: Fri, 29 Mar 2019 14:18:34 -0500 Subject: [PATCH 107/142] Adds PDA Sounds Adds new sound files and gives the PDA life! --- code/game/objects/items/devices/PDA/PDA.dm | 42 ++++++++++++++++++++ code/game/objects/items/devices/PDA/cart.dm | 15 +++++++ sound/machines/button.ogg | Bin 0 -> 7048 bytes sound/machines/button1.ogg | Bin 0 -> 5377 bytes sound/machines/button2.ogg | Bin 0 -> 5363 bytes sound/machines/button3.ogg | Bin 0 -> 5381 bytes sound/machines/button4.ogg | Bin 0 -> 5118 bytes sound/machines/terminal_eject_disc.ogg | Bin 0 -> 11286 bytes 8 files changed, 57 insertions(+) create mode 100644 sound/machines/button.ogg create mode 100644 sound/machines/button1.ogg create mode 100644 sound/machines/button2.ogg create mode 100644 sound/machines/button3.ogg create mode 100644 sound/machines/button4.ogg create mode 100644 sound/machines/terminal_eject_disc.ogg diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index ba4ae66d6a..fc4bc32719 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -391,6 +391,7 @@ GLOBAL_LIST_EMPTY(PDAs) //BASIC FUNCTIONS=================================== if("Refresh")//Refresh, goes to the end of the proc. + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if ("Toggle_Font") //CODE REVISION 2 @@ -405,12 +406,16 @@ GLOBAL_LIST_EMPTY(PDAs) font_mode = FONT_ORBITRON if (MODE_VT) font_mode = FONT_VT + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if ("Change_Color") var/new_color = input("Please enter a color name or hex value (Default is \'#808000\').",background_color)as color background_color = new_color + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if ("Toggle_Underline") underline_flag = !underline_flag + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("Return")//Return if(mode<=9) @@ -419,13 +424,19 @@ GLOBAL_LIST_EMPTY(PDAs) mode = round(mode/10) if(mode==4 || mode == 5)//Fix for cartridges. Redirects to hub. mode = 0 + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if ("Authenticate")//Checks for ID id_check(U) + if("UpdateInfo") ownjob = id.assignment if(istype(id, /obj/item/card/id/syndicate)) owner = id.registered_name update_label() + playsound(src, 'sound/machines/terminal_processing.ogg', 50, 1) + addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/machines/terminal_success.ogg', 50, 1), 13) + if("Eject")//Ejects the cart, only done from hub. if (!isnull(cartridge)) U.put_in_hands(cartridge) @@ -434,55 +445,74 @@ GLOBAL_LIST_EMPTY(PDAs) cartridge.host_pda = null cartridge = null update_icon() + playsound(src, 'sound/machines/terminal_eject_disc.ogg', 50, 1) //MENU FUNCTIONS=================================== if("0")//Hub mode = 0 + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("1")//Notes mode = 1 + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("2")//Messenger mode = 2 + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("21")//Read messeges mode = 21 + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("3")//Atmos scan mode = 3 + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("4")//Redirects to hub mode = 0 + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) //MAIN FUNCTIONS=================================== if("Light") toggle_light() + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if("Medical Scan") if(scanmode == PDA_SCANNER_MEDICAL) scanmode = PDA_SCANNER_NONE else if((!isnull(cartridge)) && (cartridge.access & CART_MEDICAL)) scanmode = PDA_SCANNER_MEDICAL + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if("Reagent Scan") if(scanmode == PDA_SCANNER_REAGENT) scanmode = PDA_SCANNER_NONE else if((!isnull(cartridge)) && (cartridge.access & CART_REAGENT_SCANNER)) scanmode = PDA_SCANNER_REAGENT + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if("Halogen Counter") if(scanmode == PDA_SCANNER_HALOGEN) scanmode = PDA_SCANNER_NONE else if((!isnull(cartridge)) && (cartridge.access & CART_ENGINE)) scanmode = PDA_SCANNER_HALOGEN + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if("Honk") if ( !(last_noise && world.time < last_noise + 20) ) playsound(src, 'sound/items/bikehorn.ogg', 50, 1) last_noise = world.time + if("Trombone") if ( !(last_noise && world.time < last_noise + 20) ) playsound(src, 'sound/misc/sadtrombone.ogg', 50, 1) last_noise = world.time + if("Gas Scan") if(scanmode == PDA_SCANNER_GAS) scanmode = PDA_SCANNER_NONE else if((!isnull(cartridge)) && (cartridge.access & CART_ATMOS)) scanmode = PDA_SCANNER_GAS + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if("Drone Phone") var/alert_s = input(U,"Alert severity level","Ping Drones",null) as null|anything in list("Low","Medium","High","Critical") var/area/A = get_area(U) @@ -490,6 +520,7 @@ GLOBAL_LIST_EMPTY(PDAs) var/msg = "NON-DRONE PING: [U.name]: [alert_s] priority alert in [A.name]!" _alert_drones(msg, TRUE, U) to_chat(U, msg) + playsound(src, 'sound/machines/terminal_success.ogg', 50, 1) //NOTEKEEPER FUNCTIONS=================================== @@ -641,6 +672,7 @@ GLOBAL_LIST_EMPTY(PDAs) if (!signal.data["done"]) to_chat(user, "ERROR: Server isn't responding.") return + playsound(src, 'sound/machines/terminal_error.ogg', 50, 1) var/target_text = signal.format_target() // Log it in our logs @@ -653,6 +685,7 @@ GLOBAL_LIST_EMPTY(PDAs) // Log in the talk log user.log_talk(message, LOG_PDA, tag="PDA: [initial(name)] to [target_text]") to_chat(user, "Message sent to [target_text]: \"[message]\"") + playsound(src, 'sound/machines/terminal_success.ogg', 50, 1) // Reset the photo picture = null last_text = world.time @@ -699,8 +732,10 @@ GLOBAL_LIST_EMPTY(PDAs) if(id) remove_id() + playsound(src, 'sound/machines/terminal_eject_disc.ogg', 50, 1) else remove_pen() + playsound(src, 'sound/machines/button4.ogg', 50, 1) /obj/item/pda/CtrlClick() ..() @@ -776,6 +811,7 @@ GLOBAL_LIST_EMPTY(PDAs) if(old_id) user.put_in_hands(old_id) update_icon() + playsound(src, 'sound/machines/button.ogg', 50, 1) return TRUE // access to status display signals @@ -787,17 +823,21 @@ GLOBAL_LIST_EMPTY(PDAs) cartridge.host_pda = src to_chat(user, "You insert [cartridge] into [src].") update_icon() + playsound(src, 'sound/machines/button.ogg', 50, 1) else if(istype(C, /obj/item/card/id)) var/obj/item/card/id/idcard = C if(!idcard.registered_name) to_chat(user, "\The [src] rejects the ID!") return + playsound(src, 'sound/machines/terminal_error.ogg', 50, 1) + if(!owner) owner = idcard.registered_name ownjob = idcard.assignment update_label() to_chat(user, "Card scanned.") + playsound(src, 'sound/machines/terminal_success.ogg', 50, 1) else //Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand. if(((src in user.contents) || (isturf(loc) && in_range(src, user))) && (C in user.contents)) @@ -823,6 +863,8 @@ GLOBAL_LIST_EMPTY(PDAs) to_chat(user, "You slide \the [C] into \the [src].") inserted_item = C update_icon() + playsound(src, 'sound/machines/button.ogg', 50, 1) + else if(istype(C, /obj/item/photo)) var/obj/item/photo/P = C picture = P.picture diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 421cc0989c..fc268e2b3e 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -580,6 +580,7 @@ Code: host_pda.mode = 441 if(!active2) active1 = null + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("Security Records") active1 = find_record("id", href_list["target"], GLOB.data_core.general) @@ -588,19 +589,23 @@ Code: host_pda.mode = 451 if(!active3) active1 = null + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("Send Signal") INVOKE_ASYNC(radio, /obj/item/integrated_signaler.proc/send_activation) + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("Signal Frequency") var/new_frequency = sanitize_frequency(radio.frequency + text2num(href_list["sfreq"])) radio.set_frequency(new_frequency) + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("Signal Code") radio.code += text2num(href_list["scode"]) radio.code = round(radio.code) radio.code = min(100, radio.code) radio.code = max(1, radio.code) + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("Status") switch(href_list["statdisp"]) @@ -616,16 +621,21 @@ Code: updateSelfDialog() else post_status(href_list["statdisp"]) + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + if("Power Select") var/pnum = text2num(href_list["target"]) powmonitor = powermonitors[pnum] host_pda.mode = 433 + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("Supply Orders") host_pda.mode =47 + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("Newscaster Access") host_pda.mode = 53 + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("Newscaster Message") var/host_pda_owner_name = host_pda.id ? "[host_pda.id.registered_name] ([host_pda.id.assignment])" : "Unknown" @@ -641,11 +651,13 @@ Code: GLOB.news_network.SubmitArticle(message,host_pda.owner,current_channel) host_pda.Topic(null,list("choice"=num2text(host_pda.mode))) return + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if("Newscaster Switch Channel") current_channel = host_pda.msg_input() host_pda.Topic(null,list("choice"=num2text(host_pda.mode))) return + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) //Bot control section! Viciously ripped from radios for being laggy and terrible. if(href_list["op"]) @@ -656,10 +668,13 @@ Code: if("botlist") active_bot = null + if("summon") //Args are in the correct order, they are stated here just as an easy reminder. active_bot.bot_control(command= "summon", user_turf= get_turf(usr), user_access= host_pda.GetAccess()) + else //Forward all other bot commands to the bot itself! active_bot.bot_control(command= href_list["op"], user= usr) + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) if(href_list["mule"]) //MULEbots are special snowflakes, and need different args due to how they work. diff --git a/sound/machines/button.ogg b/sound/machines/button.ogg new file mode 100644 index 0000000000000000000000000000000000000000..79b458317acff08550309eb150771fd618534096 GIT binary patch literal 7048 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 literal 0 HcmV?d00001 diff --git a/sound/machines/button1.ogg b/sound/machines/button1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3499e2d1722e6692bd1e60cccc3e14d8d5c90869 GIT binary patch literal 5377 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 a_^^Cu-oEWh0L(IX$3&2iFDR6(fc_0;Zz&%D literal 0 HcmV?d00001 diff --git a/sound/machines/button3.ogg b/sound/machines/button3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a28da269ad6147eaf4b02bb7b1f738910d894cec GIT binary patch literal 5381 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 J^5?y^{{zq2Kg<9C literal 0 HcmV?d00001 diff --git a/sound/machines/button4.ogg b/sound/machines/button4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9fceed1611fa0afe1a9a7e805b5e66c21bca3084 GIT binary patch literal 5118 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 Date: Sat, 30 Mar 2019 16:26:56 -0500 Subject: [PATCH 108/142] Automatic changelog generation for PR #8167 [ci skip] --- html/changelogs/AutoChangeLog-pr-8167.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8167.yml diff --git a/html/changelogs/AutoChangeLog-pr-8167.yml b/html/changelogs/AutoChangeLog-pr-8167.yml new file mode 100644 index 0000000000..105e5c34b8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8167.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - bugfix: "The endgame narsie summon rune no longer requires 24 total sacrifices, and will now properly account for cultists that surround it" From f4bdef2368ea9056139c06c6147b6fa20d0a565e Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sat, 30 Mar 2019 21:21:10 -0400 Subject: [PATCH 109/142] properly takes into account LIGHTING_HEIGHT for linear falloff --- code/modules/lighting/lighting_source.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index de9e8a90ca..fd5ea917a1 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -122,7 +122,7 @@ //Linear lighting falloff but with an octagonal shape in place of a diamond shape. Lummox JR please add pointer support. #define GET_LUM_DIST(DISTX, DISTY) (DISTX + DISTY + abs(DISTX - DISTY)*0.4) -#define LUM_FALLOFF(C, T) (1 - CLAMP01(GET_LUM_DIST(abs(C.x - T.x), abs(C.y - T.y)) / max(1, light_range+1))) +#define LUM_FALLOFF(C, T) (1 - CLAMP01(max(GET_LUM_DIST(abs(C.x - T.x), abs(C.y - T.y)),LIGHTING_HEIGHT) / max(1, light_range+1))) #define APPLY_CORNER(C) \ . = LUM_FALLOFF(C, pixel_turf); \ From 69d7cd2ff5bf9c5a513b316fc6c573db97c0f7e8 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sat, 30 Mar 2019 22:57:08 -0400 Subject: [PATCH 110/142] Adds Lohikar's optimization for update_corners --- code/modules/lighting/lighting_source.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index fd5ea917a1..8f4aea3925 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -28,6 +28,11 @@ var/needs_update = LIGHTING_NO_UPDATE // Whether we are queued for an update. +// Thanks to Lohikar for flinging this tiny bit of code at me, increasing my brain cell count from 1 to 2 in the process. +// This macro will only offset up to 1 tile, but anything with a greater offset is an outlier and probably should handle its own lighting offsets. +// Anything pixelshifted 16px or more will be considered on the next tile. +#define GET_APPROXIMATE_PIXEL_DIR(PX, PY) ((!(PX) ? 0 : ((PX >= 16 ? EAST : (PX <= -16 ? WEST : 0)))) | (!PY ? 0 : (PY >= 16 ? NORTH : (PY <= -16 ? SOUTH : 0)))) +#define UPDATE_APPROXIMATE_PIXEL_TURF var/_mask = GET_APPROXIMATE_PIXEL_DIR(top_atom.pixel_x, top_atom.pixel_y); pixel_turf = _mask ? (get_step(source_turf, _mask) || source_turf) : source_turf /datum/light_source/New(var/atom/owner, var/atom/top) source_atom = owner // Set our new owner. @@ -37,7 +42,7 @@ LAZYADD(top_atom.light_sources, src) source_turf = top_atom - pixel_turf = get_turf_pixel(top_atom) || source_turf + UPDATE_APPROXIMATE_PIXEL_TURF light_power = source_atom.light_power light_range = source_atom.light_range @@ -202,17 +207,12 @@ if (isturf(top_atom)) if (source_turf != top_atom) source_turf = top_atom - pixel_turf = source_turf + UPDATE_APPROXIMATE_PIXEL_TURF update = TRUE else if (top_atom.loc != source_turf) source_turf = top_atom.loc - pixel_turf = get_turf_pixel(top_atom) + UPDATE_APPROXIMATE_PIXEL_TURF update = TRUE - else - var/P = get_turf_pixel(top_atom) - if (P != pixel_turf) - pixel_turf = P - update = TRUE if (!isturf(source_turf)) if (applied) From c91fd98fb0d9927e6a4bcc75a4e254d01a3c8c19 Mon Sep 17 00:00:00 2001 From: Seris02 Date: Sun, 31 Mar 2019 15:13:01 +0800 Subject: [PATCH 111/142] adds bluespace bio bags --- code/game/objects/items/storage/bags.dm | 12 ++++++++++++ .../research/designs/bluespace_designs.dm | 10 ++++++++++ code/modules/research/techweb/all_nodes.dm | 2 +- icons/obj/chemical.dmi | Bin 46766 -> 47569 bytes 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index aa0c504bb4..b6c89de6b1 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -365,3 +365,15 @@ STR.max_items = 25 STR.insert_preposition = "in" STR.can_hold = typecacheof(list(/obj/item/slime_extract, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/blood, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/food/snacks/deadmouse, /obj/item/reagent_containers/food/snacks/monkeycube)) + +/obj/item/storage/bag/bio/holding + name = "bio bag of holding" + icon = 'icons/obj/chemical.dmi' + icon_state = "bspace_biobag" + desc = "A bag for the safe transportation and disposal of biowaste and other biological materials." + +/obj/item/storage/bag/bio/holding/ComponentInitialize() + . = ..() + GET_COMPONENT(STR, /datum/component/storage) + STR.max_combined_w_class = INFINITY + STR.max_items = INFINITY diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm index 40bd641478..2dc0ed77b3 100644 --- a/code/modules/research/designs/bluespace_designs.dm +++ b/code/modules/research/designs/bluespace_designs.dm @@ -24,6 +24,16 @@ dangerous_construction = TRUE departmental_flags = DEPARTMENTAL_FLAG_SCIENCE +/datum/design/biobag_holding + name = "Bio Bag of Holding" + desc = "A chemical holding thingy. Mostly used for xenobiology." + id = "biobag_holding" + build_type = PROTOLATHE + materials = list(MAT_GOLD = 1500, MAT_DIAMOND = 750, MAT_URANIUM = 250, MAT_BLUESPACE = 1000) + build_path = /obj/item/storage/bag/bio/holding + category = list("Bluespace Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + /datum/design/bluespace_crystal name = "Artificial Bluespace Crystal" desc = "A small blue crystal with mystical properties." diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index e7bbd468dc..b376dfbeea 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -219,7 +219,7 @@ display_name = "Applied Bluespace Research" description = "Using bluespace to make things faster and better." prereq_ids = list("bluespace_basic", "engineering") - design_ids = list("bs_rped","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "roastingstick", "ore_silo") + design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "roastingstick", "ore_silo") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) export_price = 5000 diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index efa7d91471c73ee301bc4717d8f327e4948b254f..93daa6149ed062a90b39df21047102ab1fccd68d 100644 GIT binary patch delta 8377 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 delta 7568 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

    ;ClQjqGKAc4==DRkS za%wTk&m)8H4Z3VwI`ym_DiGQrJPR4WgXl@C=lr8rq}G-@XYG2-ZU1N3jE{RI-|~lT z>(-Z{hwR+kpG6^~)qdv=iZ!I~eWuCJ4-DbxL~CQ9A^%Fo(p43PTbym~Ks5;&K5r?z z1|tX{cqeXYCRiVK+lyG2{1%a)pU;I&F0aEsb+AkvIR-gPNOS1R2nz?u!W-(}9+~LQ zj+#oRN?ZO?;(gK|Z&X`w@c2^~?ryg-mc`4rdVaOOX-NscJ@qOa{x?ip0;K{ygDG4J zfXStEf+zjkYK$vE=oJu+7CrBg3!N)|Ub>M%-XkGYshs&jS z7l*#TSz4MOB5i;wp5T!GBCa+NSQ;$e6)j~1*|3U$nwW*M8@{AUEIP7_e;oYKuL8ZL zfBh-9VYvI>VE)e#oD?5au-qd(y`!-3QnGRZ(dn!j{`<9~i4I(3X{`z-@VY+rnQ<)H ze~&<(cQ|=O`_|L{ORMA VY`YppeGv9jd!_xdQqeNx{{U$WK}Y}q From 1db5d908b45642c88294a8826bb29589fe581733 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 31 Mar 2019 05:17:23 -0400 Subject: [PATCH 112/142] Slightly optimizes goonchat by removing checks for a completely unused feature --- .../browserassets/js/browserOutput.js | 110 ++++-------------- 1 file changed, 25 insertions(+), 85 deletions(-) diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index 15265b2a93..23a63d9708 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -245,96 +245,41 @@ function output(message, flag) { message = byondDecode(message).trim(); - //The behemoth of filter-code (for Admin message filters) - //Note: This is proooobably hella inefficient - var filteredOut = false; - if (opts.hasOwnProperty('showMessagesFilters') && !opts.showMessagesFilters['All'].show) { - //Get this filter type (defined by class on message) - var messageHtml = $.parseHTML(message), - messageClasses; - if (opts.hasOwnProperty('filterHideAll') && opts.filterHideAll) { - var internal = false; - messageClasses = (!!$(messageHtml).attr('class') ? $(messageHtml).attr('class').split(/\s+/) : false); - if (messageClasses) { - for (var i = 0; i < messageClasses.length; i++) { //Every class - if (messageClasses[i] == 'internal') { - internal = true; - break; - } - } - } - if (!internal) { - filteredOut = 'All'; - } - } else { - //If the element or it's child have any classes - if (!!$(messageHtml).attr('class') || !!$(messageHtml).children().attr('class')) { - messageClasses = $(messageHtml).attr('class').split(/\s+/); - if (!!$(messageHtml).children().attr('class')) { - messageClasses = messageClasses.concat($(messageHtml).children().attr('class').split(/\s+/)); - } - var tempCount = 0; - for (var i = 0; i < messageClasses.length; i++) { //Every class - var thisClass = messageClasses[i]; - $.each(opts.showMessagesFilters, function(key, val) { //Every filter - if (key !== 'All' && val.show === false && typeof val.match != 'undefined') { - for (var i = 0; i < val.match.length; i++) { - var matchClass = val.match[i]; - if (matchClass == thisClass) { - filteredOut = key; - break; - } - } - } - if (filteredOut) return false; - }); - if (filteredOut) break; - tempCount++; - } - } else { - if (!opts.showMessagesFilters['Misc'].show) { - filteredOut = 'Misc'; - } - } - } - } - //Stuff we do along with appending a message var atBottom = false; - if (!filteredOut) { - var bodyHeight = $('body').height(); - var messagesHeight = $messages.outerHeight(); - var scrollPos = $('body,html').scrollTop(); + var bodyHeight = $('body').height(); + var messagesHeight = $messages.outerHeight(); + var scrollPos = $('body,html').scrollTop(); - //Should we snap the output to the bottom? - if (bodyHeight + scrollPos >= messagesHeight - opts.scrollSnapTolerance) { - atBottom = true; - if ($('#newMessages').length) { - $('#newMessages').remove(); + //Should we snap the output to the bottom? + if (bodyHeight + scrollPos >= messagesHeight - opts.scrollSnapTolerance) { + atBottom = true; + if ($('#newMessages').length) { + $('#newMessages').remove(); + } + //If not, put the new messages box in + } else { + if ($('#newMessages').length) { + var messages = $('#newMessages .number').text(); + messages = parseInt(messages); + messages++; + $('#newMessages .number').text(messages); + if (messages == 2) { + $('#newMessages .messageWord').append('s'); } - //If not, put the new messages box in } else { - if ($('#newMessages').length) { - var messages = $('#newMessages .number').text(); - messages = parseInt(messages); - messages++; - $('#newMessages .number').text(messages); - if (messages == 2) { - $('#newMessages .messageWord').append('s'); - } - } else { - $messages.after('1 new message '); - } + $messages.after('1 new message '); } } + opts.messageCount++; //Pop the top message off if history limit reached - if (opts.messageCount >= opts.messageLimit) { - $messages.children('div.entry:first-child').remove(); - opts.messageCount--; //I guess the count should only ever equal the limit - } + //if (opts.messageCount >= opts.messageLimit) { + //$messages.children('div.entry:first-child').remove(); + //opts.messageCount--; //I guess the count should only ever equal the limit + //} // Create the element - if combining is off, we use it, and if it's on, we // might discard it bug need to check its text content. Some messages vary @@ -372,11 +317,6 @@ function output(message, flag) { //Actually append the message entry.className = 'entry'; - if (filteredOut) { - entry.className += ' hidden'; - entry.setAttribute('data-filter', filteredOut); - } - $last_message = trimmed_message; $messages[0].appendChild(entry); $(entry).find("img.icon").error(iconError); @@ -401,7 +341,7 @@ function output(message, flag) { } } - if (!filteredOut && atBottom) { + if (atBottom) { $('body,html').scrollTop($messages.outerHeight()); } } From f3624c48fc0abda7a605eb6c482d0315818c6a3b Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 31 Mar 2019 06:09:27 -0400 Subject: [PATCH 113/142] makes the storage hud properly stretch to accomodate for the screen space provided by widescreen and other weird view scales --- code/datums/components/storage/storage.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index bb3c584cb9..dc25729e37 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -297,7 +297,7 @@ ND.number++ //This proc determines the size of the inventory to be displayed. Please touch it only if you know what you're doing. -/datum/component/storage/proc/orient2hud() +/datum/component/storage/proc/orient2hud(mob/user, maxcolumns) var/atom/real_location = real_location() var/adjusted_contents = real_location.contents.len @@ -307,7 +307,7 @@ numbered_contents = _process_numerical_display() adjusted_contents = numbered_contents.len - var/columns = CLAMP(max_items, 1, screen_max_columns) + var/columns = CLAMP(max_items, 1, maxcolumns ? maxcolumns : screen_max_columns) var/rows = CLAMP(CEILING(adjusted_contents / columns, 1), 1, screen_max_rows) standard_orient_objs(rows, columns, numbered_contents) @@ -351,6 +351,8 @@ /datum/component/storage/proc/show_to(mob/M) if(!M.client) return FALSE + var/list/cview = getviewsize(M.client.view) + var/maxallowedscreensize = cview[1]-8 var/atom/real_location = real_location() if(M.active_storage != src && (M.stat == CONSCIOUS)) for(var/obj/item/I in real_location) @@ -358,7 +360,7 @@ return FALSE if(M.active_storage) M.active_storage.hide_from(M) - orient2hud() + orient2hud(M, (isliving(M) ? maxallowedscreensize : 7)) M.client.screen |= boxes M.client.screen |= closer M.client.screen |= real_location.contents From b10850562961666c956254b6acc26139e4493ee1 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sun, 31 Mar 2019 19:28:40 -0400 Subject: [PATCH 114/142] Update chem_dispenser.dm --- .../chemistry/machinery/chem_dispenser.dm | 69 +++++++++++++++---- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 8cb5f6254c..3f15467f40 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -49,12 +49,27 @@ "bromine", "stable_plasma" ) +//these become available once upgraded. + var/list/upgrade_reagents = list( + "oil", + "ammonia" + ) + + var/list/upgrade_reagents2 = list( + "acetone", + "phenol", + "diethylamine" + ) + + var/list/upgrade_reagents3 = list( + "omnizine" + ) + var/list/emagged_reagents = list( - "space_drugs", - "morphine", + "sulfonal", + "frostoil", "carpotoxin", - "mine_salve", - "toxin" + "histamine" ) var/list/saved_recipes = list() @@ -74,7 +89,17 @@ ..() if(panel_open) to_chat(user, "[src]'s maintenance hatch is open!") - + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads:
    Recharging [recharge_amount] power units per interval.
    Power efficiency increased by [(powerefficiency*1000)-100]%.") + switch(macrotier) + if(1) + to_chat(user, "Macro granularity at 5u.") + if(2) + to_chat(user, "Macro granularity at 3u.") + if(3) + to_chat(user, "Macro granularity at 2u.") + if(4) + to_chat(user, "Macro granularity at 1u.") /obj/machinery/chem_dispenser/process() if (recharge_counter >= 4) if(!is_operational()) @@ -346,6 +371,12 @@ for(var/obj/item/stock_parts/manipulator/M in component_parts) if (M.rating > macrotier) macrotier = M.rating + if (M.rating > 1) + dispensable_reagents |= upgrade_reagents + if (M.rating > 2) + dispensable_reagents |= upgrade_reagents2 + if (M.rating > 3) + dispensable_reagents |= upgrade_reagents3 powerefficiency = round(newpowereff, 0.01) @@ -447,14 +478,17 @@ "tomatojuice", "lemonjuice", "menthol" - ) + ) //prevents the soda machine from obtaining chemical upgrades. . + upgrade_reagents = null + upgrade_reagents2 = null + upgrade_reagents3 = null emagged_reagents = list( "thirteenloko", - "whiskeycola", - "mindbreaker", - "tirizene" + "morphine", + "uranium" ) + /obj/machinery/chem_dispenser/drinks/fullupgrade //fully ugpraded stock parts, emagged desc = "Contains a large reservoir of soft drinks. This model has had its safeties shorted out." obj_flags = CAN_BE_HIT | EMAGGED @@ -497,13 +531,15 @@ "creme_de_cacao", "triple_sec", "sake" - ) + )//prevents the booze machine from obtaining chemical upgrades. + upgrade_reagents = null + upgrade_reagents2 = null + upgrade_reagents3 = null emagged_reagents = list( - "ethanol", "iron", + "clownstears", "minttoxin", - "atomicbomb", - "fernet" + "slimejelly" ) /obj/machinery/chem_dispenser/drinks/beer/fullupgrade //fully ugpraded stock parts, emagged @@ -528,6 +564,7 @@ name = "mutagen dispenser" desc = "Creates and dispenses mutagen." dispensable_reagents = list("mutagen") + upgrade_reagents = null emagged_reagents = list("plasma") @@ -550,7 +587,11 @@ "ammonia", "ash", "diethylamine") - + //same as above. + upgrade_reagents = null + upgrade_reagents2 = null + upgrade_reagents3 = null + /obj/machinery/chem_dispenser/mutagensaltpeter/Initialize() . = ..() component_parts = list() From 5883b53a87a5e23057c628cd0b64b15904568313 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sun, 31 Mar 2019 19:33:13 -0400 Subject: [PATCH 115/142] Update chem_dispenser.dm --- .../chemistry/machinery/chem_dispenser.dm | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 3f15467f40..f7e5e7b0ea 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -69,7 +69,9 @@ "sulfonal", "frostoil", "carpotoxin", - "histamine" + "histamine", + "space_drugs", + "morphine" ) var/list/saved_recipes = list() @@ -485,7 +487,10 @@ emagged_reagents = list( "thirteenloko", "morphine", - "uranium" + "uranium", + "whiskeycola", + "mindbreaker", + "tirizene" ) @@ -536,10 +541,15 @@ upgrade_reagents2 = null upgrade_reagents3 = null emagged_reagents = list( + "ethanol", "iron", "clownstears", "minttoxin", - "slimejelly" + "atomicbomb", + "fernet", + "slimejelly", + "aphro", + "aphro+" ) /obj/machinery/chem_dispenser/drinks/beer/fullupgrade //fully ugpraded stock parts, emagged From 1b1786800a29781ea6f8241acc947ed62406a387 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sun, 31 Mar 2019 20:29:07 -0400 Subject: [PATCH 116/142] Update chem_dispenser.dm --- code/modules/reagents/chemistry/machinery/chem_dispenser.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index f7e5e7b0ea..10023406c9 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -66,11 +66,11 @@ ) var/list/emagged_reagents = list( + "space_drugs", "sulfonal", "frostoil", "carpotoxin", "histamine", - "space_drugs", "morphine" ) From f45ebe29d787e84d69f3b5127a28ff5a53b16ceb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 31 Mar 2019 20:19:24 -0500 Subject: [PATCH 117/142] Automatic changelog generation for PR #8164 [ci skip] --- html/changelogs/AutoChangeLog-pr-8164.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8164.yml diff --git a/html/changelogs/AutoChangeLog-pr-8164.yml b/html/changelogs/AutoChangeLog-pr-8164.yml new file mode 100644 index 0000000000..5d00b5b9ba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8164.yml @@ -0,0 +1,12 @@ +author: "Poojawa" +delete-after: True +changes: + - bugfix: "Vore Panel restored to have various interactions available again. Semi-untested but should work as advertised." + - tweak: "Vore Panel has more feedback." + - rscadd: "is_wet var to bellies, toggled in the panel, will remove flesh sounding struggles and the internal loop. JSON version updated." + - rscadd: "Feeding var. You will need to enable feeding to recieve any feed vore actions, but you can now feed yourself to mobs that have this set. TODO, Dogborg sleeper feeding." + - rscadd: "vore mode button now required to be enabled to perform vore actions. It's the mouth icon!" + - bugfix: "Ash Drake vore fixed for actual reals this time" + - bugfix: "Mobs shouldn't spam the released contents announcement anymore on qdel or death. Only if triggered" + - tweak: "Hostile mob code now properly ignores targets in bellies" + - rscadd: "Your belly can quietly growl if you're starving now." From aadcf594ffd498f6459e14797d7d4a364c8f7785 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 31 Mar 2019 20:21:00 -0500 Subject: [PATCH 118/142] Automatic changelog generation for PR #8159 [ci skip] --- html/changelogs/AutoChangeLog-pr-8159.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8159.yml diff --git a/html/changelogs/AutoChangeLog-pr-8159.yml b/html/changelogs/AutoChangeLog-pr-8159.yml new file mode 100644 index 0000000000..da0f13e28a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8159.yml @@ -0,0 +1,6 @@ +author: "Poojawa" +delete-after: True +changes: + - balance: "Ashwalkers now have lungs. They cannot breath station air without suffocation effects, but are completely fine on their homeworld." + - balance: "Carbon mobs now have a maximum tolerance to oxygen of 50kPa." + - balance: "Deluxe synthetic lungs have a very high bonus to O2 tolerance." From aa38960ab6fe4863aef8434149383763c5487369 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 1 Apr 2019 11:01:26 +0800 Subject: [PATCH 119/142] Update code/game/objects/items/storage/bags.dm Co-Authored-By: Seris02 <49109742+Seris02@users.noreply.github.com> --- code/game/objects/items/storage/bags.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index b6c89de6b1..bd2bede87c 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -376,4 +376,4 @@ . = ..() GET_COMPONENT(STR, /datum/component/storage) STR.max_combined_w_class = INFINITY - STR.max_items = INFINITY + STR.max_items = 100 From de7398b1edbb7bc7aea71ef418e03236b49c307b Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sun, 31 Mar 2019 23:48:10 -0400 Subject: [PATCH 120/142] Update chem_dispenser.dm --- code/modules/reagents/chemistry/machinery/chem_dispenser.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 10023406c9..ad6b7dee51 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -62,7 +62,8 @@ ) var/list/upgrade_reagents3 = list( - "omnizine" + "omnizine", + "glycerol" ) var/list/emagged_reagents = list( From 0bb042566bbc56b8f57e7c960fd1aa28590774ba Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 1 Apr 2019 02:05:18 -0400 Subject: [PATCH 121/142] this is byond explanation - increases the amount of sanity checks in the client update part of /mob/Login() --- code/modules/mob/login.dm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 8d1b4b18d4..4d5d75c7e6 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -43,12 +43,13 @@ if(client) client.change_view(CONFIG_GET(string/default_view)) // Resets the client.view in case it was changed. - if(client.player_details.player_actions.len) - for(var/datum/action/A in client.player_details.player_actions) - A.Grant(src) + if(client.player_details && istype(client.player_details)) + if(client.player_details.player_actions.len) + for(var/datum/action/A in client.player_details.player_actions) + A.Grant(src) - for(var/foo in client.player_details.post_login_callbacks) - var/datum/callback/CB = foo - CB.Invoke() + for(var/foo in client.player_details.post_login_callbacks) + var/datum/callback/CB = foo + CB.Invoke() log_message("Client [key_name(src)] has taken ownership of mob [src]([src.type])", LOG_OWNERSHIP) From ceaa897d1ccfd000fe239d0daf017e93e685f70c Mon Sep 17 00:00:00 2001 From: BlackMajor Date: Mon, 1 Apr 2019 19:19:29 +1300 Subject: [PATCH 122/142] Update mind.dm --- code/datums/mind.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 741822d546..90affe0228 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -753,7 +753,7 @@ var/obj/effect/proc_holder/spell/S = X S.action.Grant(new_character) var/datum/antagonist/changeling/changeling = new_character.mind.has_antag_datum(/datum/antagonist/changeling) - if(changeling) + if(changeling &&(ishuman(new_character) || ismonkey(new_character))) for(var/P in changeling.purchasedpowers) var/obj/effect/proc_holder/changeling/I = P I.action.Grant(new_character) From 6e900d2a9d7a36951e5af4c22da9d68b5e5eff8f Mon Sep 17 00:00:00 2001 From: Zandario Date: Mon, 1 Apr 2019 13:19:35 -0500 Subject: [PATCH 123/142] Hippie Circuit Port --- .../integrated_electronics/_defines.dm | 5 + .../subtypes/atmospherics.dm | 762 ++++++++++++++++++ .../integrated_electronics/subtypes/input.dm | 93 ++- .../subtypes/manipulation.dm | 137 ++++ .../integrated_electronics/subtypes/output.dm | 28 +- .../subtypes/reagents.dm | 315 ++++++++ .../integrated_electronics/subtypes/smart.dm | 259 ++++++ tgstation.dme | 2 + 8 files changed, 1599 insertions(+), 2 deletions(-) create mode 100644 code/modules/integrated_electronics/_defines.dm create mode 100644 code/modules/integrated_electronics/subtypes/atmospherics.dm diff --git a/code/modules/integrated_electronics/_defines.dm b/code/modules/integrated_electronics/_defines.dm new file mode 100644 index 0000000000..a2f4aa190a --- /dev/null +++ b/code/modules/integrated_electronics/_defines.dm @@ -0,0 +1,5 @@ +#define IC_TOPIC_UNHANDLED 0 +#define IC_TOPIC_HANDLED 1 +#define IC_TOPIC_REFRESH 2 +#define IC_FLAG_ANCHORABLE 1 +#define IC_FLAG_CAN_FIRE 2 \ No newline at end of file diff --git a/code/modules/integrated_electronics/subtypes/atmospherics.dm b/code/modules/integrated_electronics/subtypes/atmospherics.dm new file mode 100644 index 0000000000..1715223fa2 --- /dev/null +++ b/code/modules/integrated_electronics/subtypes/atmospherics.dm @@ -0,0 +1,762 @@ +#define SOURCE_TO_TARGET 0 +#define TARGET_TO_SOURCE 1 +#define PUMP_EFFICIENCY 0.6 +#define TANK_FAILURE_PRESSURE (ONE_ATMOSPHERE*25) +#define PUMP_MAX_PRESSURE (ONE_ATMOSPHERE*24) +#define PUMP_MAX_VOLUME 100 + + +/obj/item/integrated_circuit/atmospherics + category_text = "Atmospherics" + cooldown_per_use = 2 SECONDS + complexity = 10 + size = 7 + outputs = list( + "self reference" = IC_PINTYPE_SELFREF, + "pressure" = IC_PINTYPE_NUMBER + ) + var/datum/gas_mixture/air_contents + var/volume = 2 //Pretty small, I know + +/obj/item/integrated_circuit/atmospherics/Initialize() + air_contents = new(volume) + ..() + +/obj/item/integrated_circuit/atmospherics/return_air() + return air_contents + +//Check if the gas container is adjacent and of the right type +/obj/item/integrated_circuit/atmospherics/proc/check_gassource(atom/gasholder) + if(!gasholder) + return FALSE + if(!gasholder.Adjacent(get_object())) + return FALSE + if(!istype(gasholder, /obj/item/tank) && !istype(gasholder, /obj/machinery/portable_atmospherics) && !istype(gasholder, /obj/item/integrated_circuit/atmospherics)) + return FALSE + return TRUE + +//Needed in circuits where source and target types differ +/obj/item/integrated_circuit/atmospherics/proc/check_gastarget(atom/gasholder) + return check_gassource(gasholder) + + +// - gas pump - // **works** +/obj/item/integrated_circuit/atmospherics/pump + name = "gas pump" + desc = "Somehow moves gases between two tanks, canisters, and other gas containers." + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + inputs = list( + "source" = IC_PINTYPE_REF, + "target" = IC_PINTYPE_REF, + "target pressure" = IC_PINTYPE_NUMBER + ) + activators = list( + "transfer" = IC_PINTYPE_PULSE_IN, + "on transfer" = IC_PINTYPE_PULSE_OUT + ) + var/direction = SOURCE_TO_TARGET + var/target_pressure = PUMP_MAX_PRESSURE + power_draw_per_use = 20 + +/obj/item/integrated_circuit/atmospherics/pump/Initialize() + air_contents = new(volume) + extended_desc += " Use negative pressure to move air from target to source. \ + Note that only part of the gas is moved on each transfer, \ + so multiple activations will be necessary to achieve target pressure. \ + The pressure limit for circuit pumps is [round(PUMP_MAX_PRESSURE)] kPa." + . = ..() + +// This proc gets the direction of the gas flow depending on its value, by calling update target +/obj/item/integrated_circuit/atmospherics/pump/on_data_written() + var/amt = get_pin_data(IC_INPUT, 3) + update_target(amt) + +/obj/item/integrated_circuit/atmospherics/pump/proc/update_target(new_amount) + if(!isnum(new_amount)) + new_amount = 0 + // See in which direction the gas moves + if(new_amount < 0) + direction = TARGET_TO_SOURCE + else + direction = SOURCE_TO_TARGET + target_pressure = min(round(PUMP_MAX_PRESSURE),abs(new_amount)) + +/obj/item/integrated_circuit/atmospherics/pump/do_work() + var/obj/source = get_pin_data_as_type(IC_INPUT, 1, /obj) + var/obj/target = get_pin_data_as_type(IC_INPUT, 2, /obj) + perform_magic(source, target) + activate_pin(2) + +/obj/item/integrated_circuit/atmospherics/pump/proc/perform_magic(atom/source, atom/target) + //Check if both atoms are of the right type: atmos circuits/gas tanks/canisters. If one is the same, use the circuit var + if(!check_gassource(source)) + source = src + + if(!check_gastarget(target)) + target = src + + // If both are the same, this whole proc would do nothing and just waste performance + if(source == target) + return + + var/datum/gas_mixture/source_air = source.return_air() + var/datum/gas_mixture/target_air = target.return_air() + + if(!source_air || !target_air) + return + + // Swapping both source and target + if(direction == TARGET_TO_SOURCE) + var/temp = source_air + source_air = target_air + target_air = temp + + // If what you are pumping is empty, use the circuit's storage + if(source_air.total_moles() <= 0) + source_air = air_contents + + // Move gas from one place to another + move_gas(source_air, target_air) + air_update_turf() + +/obj/item/integrated_circuit/atmospherics/pump/proc/move_gas(datum/gas_mixture/source_air, datum/gas_mixture/target_air) + + // No moles = nothing to pump + if(source_air.total_moles() <= 0 || target_air.return_pressure() >= PUMP_MAX_PRESSURE) + return + + // Negative Kelvin temperatures should never happen and if they do, normalize them + if(source_air.temperature < TCMB) + source_air.temperature = TCMB + + var/pressure_delta = target_pressure - target_air.return_pressure() + if(pressure_delta > 0.1) + var/transfer_moles = (pressure_delta*target_air.volume/(source_air.temperature * R_IDEAL_GAS_EQUATION))*PUMP_EFFICIENCY + var/datum/gas_mixture/removed = source_air.remove(transfer_moles) + target_air.merge(removed) + + +// - volume pump - // **Works** +/obj/item/integrated_circuit/atmospherics/pump/volume + name = "volume pump" + desc = "Moves gases between two tanks, canisters, and other gas containers by using their volume, up to 200 L/s." + extended_desc = " Use negative volume to move air from target to source. Note that only part of the gas is moved on each transfer. Its maximum pumping volume is capped at 1000kPa." + + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + inputs = list( + "source" = IC_PINTYPE_REF, + "target" = IC_PINTYPE_REF, + "transfer volume" = IC_PINTYPE_NUMBER + ) + activators = list( + "transfer" = IC_PINTYPE_PULSE_IN, + "on transfer" = IC_PINTYPE_PULSE_OUT + ) + direction = SOURCE_TO_TARGET + var/transfer_rate = PUMP_MAX_VOLUME + power_draw_per_use = 20 + +/obj/item/integrated_circuit/atmospherics/pump/volume/update_target(new_amount) + if(!isnum(new_amount)) + new_amount = 0 + // See in which direction the gas moves + if(new_amount < 0) + direction = TARGET_TO_SOURCE + else + direction = SOURCE_TO_TARGET + target_pressure = min(PUMP_MAX_VOLUME,abs(new_amount)) + +/obj/item/integrated_circuit/atmospherics/pump/volume/move_gas(datum/gas_mixture/source_air, datum/gas_mixture/target_air) + // No moles = nothing to pump + if(source_air.total_moles() <= 0) + return + + // Negative Kelvin temperatures should never happen and if they do, normalize them + if(source_air.temperature < TCMB) + source_air.temperature = TCMB + + if((source_air.return_pressure() < 0.01) || (target_air.return_pressure() >= PUMP_MAX_PRESSURE)) + return + + //The second part of the min caps the pressure built by the volume pumps to the max pump pressure + var/transfer_ratio = min(transfer_rate,target_air.volume*PUMP_MAX_PRESSURE/source_air.return_pressure())/source_air.volume + + var/datum/gas_mixture/removed = source_air.remove_ratio(transfer_ratio * PUMP_EFFICIENCY) + + target_air.merge(removed) + + +// - gas vent - // **works** +/obj/item/integrated_circuit/atmospherics/pump/vent + name = "gas vent" + extended_desc = "Use negative volume to move air from target to environment. Note that only part of the gas is moved on each transfer. Unlike the gas pump, this one keeps pumping even further to pressures of 9000 pKa and it is not advised to use it on tank circuits." + desc = "Moves gases between the environment and adjacent gas containers." + inputs = list( + "container" = IC_PINTYPE_REF, + "target pressure" = IC_PINTYPE_NUMBER + ) + +/obj/item/integrated_circuit/atmospherics/pump/vent/on_data_written() + var/amt = get_pin_data(IC_INPUT, 2) + update_target(amt) + +/obj/item/integrated_circuit/atmospherics/pump/vent/do_work() + var/turf/source = get_turf(src) + var/obj/target = get_pin_data_as_type(IC_INPUT, 1, /obj) + perform_magic(source, target) + activate_pin(2) + +/obj/item/integrated_circuit/atmospherics/pump/vent/check_gastarget(atom/gasholder) + if(!gasholder) + return FALSE + if(!gasholder.Adjacent(get_object())) + return FALSE + if(!istype(gasholder, /obj/item/tank) && !istype(gasholder, /obj/machinery/portable_atmospherics) && !istype(gasholder, /obj/item/integrated_circuit/atmospherics)) + return FALSE + return TRUE + + +/obj/item/integrated_circuit/atmospherics/pump/vent/check_gassource(atom/target) + if(!target) + return FALSE + if(!istype(target, /turf)) + return FALSE + return TRUE + + +// - integrated connector - // Can connect and disconnect properly +/obj/item/integrated_circuit/atmospherics/connector + name = "integrated connector" + desc = "Creates an airtight seal with standard connectors found on the floor, \ + allowing the assembly to exchange gases with a pipe network." + extended_desc = "This circuit will automatically attempt to locate and connect to ports on the floor beneath it when activated. \ + You must set a target before connecting." + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + inputs = list( + "target" = IC_PINTYPE_REF + ) + activators = list( + "toggle connection" = IC_PINTYPE_PULSE_IN, + "on connected" = IC_PINTYPE_PULSE_OUT, + "on connection failed" = IC_PINTYPE_PULSE_OUT, + "on disconnected" = IC_PINTYPE_PULSE_OUT + ) + + var/obj/machinery/atmospherics/components/unary/portables_connector/connector + +/obj/item/integrated_circuit/atmospherics/connector/Initialize() + air_contents = new(volume) + START_PROCESSING(SSobj, src) + . = ..() + +//Sucks up the gas from the connector +/obj/item/integrated_circuit/atmospherics/connector/process() + set_pin_data(IC_OUTPUT, 2, air_contents.return_pressure()) + +/obj/item/integrated_circuit/atmospherics/connector/check_gassource(atom/gasholder) + if(!gasholder) + return FALSE + if(!istype(gasholder,/obj/machinery/atmospherics/components/unary/portables_connector)) + return FALSE + return TRUE + +//If the assembly containing this is moved from the tile the connector pipe is in, the connection breaks +/obj/item/integrated_circuit/atmospherics/connector/ext_moved() + if(connector) + if(get_dist(get_object(), connector) > 0) + // The assembly is set as connected device and the connector handles the rest + connector.connected_device = null + connector = null + activate_pin(4) + +/obj/item/integrated_circuit/atmospherics/connector/do_work() + // If there is a connection, disconnect + if(connector) + connector.connected_device = null + connector = null + activate_pin(4) + return + + var/obj/machinery/atmospherics/components/unary/portables_connector/PC = locate() in get_turf(src) + // If no connector can't connect + if(!PC) + activate_pin(3) + return + connector = PC + connector.connected_device = src + activate_pin(2) + +// Required for making the connector port script work +obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir() + return air_contents + + +// - gas filter - // **works** +/obj/item/integrated_circuit/atmospherics/pump/filter + name = "gas filter" + desc = "Filters one gas out of a mixture." + complexity = 20 + size = 8 + spawn_flags = IC_SPAWN_RESEARCH + inputs = list( + "source" = IC_PINTYPE_REF, + "filtered output" = IC_PINTYPE_REF, + "contaminants output" = IC_PINTYPE_REF, + "wanted gases" = IC_PINTYPE_LIST, + "target pressure" = IC_PINTYPE_NUMBER + ) + power_draw_per_use = 30 + +/obj/item/integrated_circuit/atmospherics/pump/filter/on_data_written() + var/amt = get_pin_data(IC_INPUT, 5) + target_pressure = CLAMP(amt, 0, PUMP_MAX_PRESSURE) + +/obj/item/integrated_circuit/atmospherics/pump/filter/do_work() + activate_pin(2) + var/obj/source = get_pin_data_as_type(IC_INPUT, 1, /obj) + var/obj/filtered = get_pin_data_as_type(IC_INPUT, 2, /obj) + var/obj/contaminants = get_pin_data_as_type(IC_INPUT, 3, /obj) + + var/wanted = get_pin_data(IC_INPUT, 4) + + // If there is no filtered output, this whole thing makes no sense + if(!check_gassource(filtered)) + return + + var/datum/gas_mixture/filtered_air = filtered.return_air() + if(!filtered_air) + return + + // If no source is set, the source is possibly this circuit's content + if(!check_gassource(source)) + source = src + var/datum/gas_mixture/source_air = source.return_air() + + //No source air: source is this circuit + if(!source_air) + source_air = air_contents + + // If no filtering tank is set, filter through itself + if(!check_gassource(contaminants)) + contaminants = src + var/datum/gas_mixture/contaminated_air = contaminants.return_air() + + //If there is no gas mixture datum for unfiltered, pump the contaminants back into the circuit + if(!contaminated_air) + contaminated_air = air_contents + + if(contaminated_air.return_pressure() >= PUMP_MAX_PRESSURE || filtered_air.return_pressure() >= PUMP_MAX_PRESSURE) + return + + var/pressure_delta = target_pressure - contaminated_air.return_pressure() + var/transfer_moles + + //Negative Kelvins are an anomaly and should be normalized if encountered + if(source_air.temperature < TCMB) + source_air.temperature = TCMB + + transfer_moles = (pressure_delta*contaminated_air.volume/(source_air.temperature * R_IDEAL_GAS_EQUATION))*PUMP_EFFICIENCY + + //If there is nothing to transfer, just return + if(transfer_moles <= 0) + return + + //This is the var that holds the currently filtered part of the gas + var/datum/gas_mixture/removed = source_air.remove(transfer_moles) + if(!removed) + return + + //This is the gas that will be moved from source to filtered + var/datum/gas_mixture/filtered_out = new + + for(var/filtered_gas in removed.gases) + //Get the name of the gas and see if it is in the list + if(removed.gases[filtered_gas][GAS_META][META_GAS_NAME] in wanted) + //The gas that is put in all the filtered out gases + filtered_out.temperature = removed.temperature + filtered_out.add_gas(filtered_gas) + filtered_out.gases[filtered_gas][MOLES] = removed.gases[filtered_gas][MOLES] + + //The filtered out gas is entirely removed from the currently filtered gases + removed.gases[filtered_gas][MOLES] = 0 + removed.garbage_collect() + + //Check if the pressure is high enough to put stuff in filtered, or else just put it back in the source + var/datum/gas_mixture/target = (filtered_air.return_pressure() < target_pressure ? filtered_air : source_air) + target.merge(filtered_out) + contaminated_air.merge(removed) + + +/obj/item/integrated_circuit/atmospherics/pump/filter/Initialize() + air_contents = new(volume) + . = ..() + extended_desc = "Remember to properly spell and capitalize the filtered gas name. \ + Note that only part of the gas is moved on each transfer, \ + so multiple activations will be necessary to achieve target pressure. \ + The pressure limit for circuit pumps is [round(PUMP_MAX_PRESSURE)] kPa." + + +// - gas mixer - // **works** +/obj/item/integrated_circuit/atmospherics/pump/mixer + name = "gas mixer" + desc = "Mixes 2 different types of gases." + complexity = 20 + size = 8 + spawn_flags = IC_SPAWN_RESEARCH + inputs = list( + "first source" = IC_PINTYPE_REF, + "second source" = IC_PINTYPE_REF, + "output" = IC_PINTYPE_REF, + "first source percentage" = IC_PINTYPE_NUMBER, + "target pressure" = IC_PINTYPE_NUMBER + ) + power_draw_per_use = 30 + +/obj/item/integrated_circuit/atmospherics/pump/mixer/do_work() + activate_pin(2) + var/obj/source_1 = get_pin_data(IC_INPUT, 1) + var/obj/source_2 = get_pin_data(IC_INPUT, 2) + var/obj/gas_output = get_pin_data(IC_INPUT, 3) + if(!check_gassource(source_1)) + source_1 = src + + if(!check_gassource(source_2)) + source_2 = src + + if(!check_gassource(gas_output)) + gas_output = src + + if(source_1 == gas_output || source_2 == gas_output) + return + + var/datum/gas_mixture/source_1_gases = source_1.return_air() + var/datum/gas_mixture/source_2_gases = source_2.return_air() + var/datum/gas_mixture/output_gases = gas_output.return_air() + + if(!source_1_gases || !source_2_gases || !output_gases) + return + + if(output_gases.return_pressure() >= PUMP_MAX_PRESSURE) + return + + if(source_1_gases.return_pressure() <= 0 || source_2_gases.return_pressure() <= 0) + return + + //This calculates how much should be sent + var/gas_percentage = round(max(min(get_pin_data(IC_INPUT, 4),100),0) / 100) + + //Basically: number of moles = percentage of pressure filled up * efficiency coefficient * (pressure from both gases * volume of output) / (R * Temperature) + var/transfer_moles = (get_pin_data(IC_INPUT, 5) / max(1,output_gases.return_pressure())) * PUMP_EFFICIENCY * (source_1_gases.return_pressure() * gas_percentage + source_2_gases.return_pressure() * (1 - gas_percentage)) * output_gases.volume/ (R_IDEAL_GAS_EQUATION * max(output_gases.temperature,TCMB)) + + + if(transfer_moles <= 0) + return + + var/datum/gas_mixture/mix = source_1_gases.remove(transfer_moles * gas_percentage) + output_gases.merge(mix) + mix = source_2_gases.remove(transfer_moles * (1-gas_percentage)) + output_gases.merge(mix) + + +// - integrated tank - // **works** +/obj/item/integrated_circuit/atmospherics/tank + name = "integrated tank" + desc = "A small tank for the storage of gases." + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + size = 4 + activators = list( + "push ref" = IC_PINTYPE_PULSE_IN + ) + volume = 3 //emergency tank sized + var/broken = FALSE + +/obj/item/integrated_circuit/atmospherics/tank/Initialize() + air_contents = new(volume) + START_PROCESSING(SSobj, src) + extended_desc = "Take care not to pressurize it above [round(TANK_FAILURE_PRESSURE)] kPa, or else it will break." + . = ..() + +/obj/item/integrated_circuit/atmospherics/tank/Destroy() + STOP_PROCESSING(SSobj, src) + . = ..() + +/obj/item/integrated_circuit/atmospherics/tank/do_work() + set_pin_data(IC_OUTPUT, 1, WEAKREF(src)) + push_data() + +/obj/item/integrated_circuit/atmospherics/tank/process() + var/tank_pressure = air_contents.return_pressure() + set_pin_data(IC_OUTPUT, 2, tank_pressure) + push_data() + + //Check if tank broken + if(!broken && tank_pressure > TANK_FAILURE_PRESSURE) + broken = TRUE + to_chat(view(2),"The [name] ruptures, releasing its gases!") + if(broken) + release() + +/obj/item/integrated_circuit/atmospherics/tank/proc/release() + if(air_contents.total_moles() > 0) + playsound(loc, 'sound/effects/spray.ogg', 10, 1, -3) + var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles()) + var/turf/current_turf = get_turf(src) + var/datum/gas_mixture/exterior_gas + if(!current_turf) + return + + exterior_gas = current_turf.return_air() + exterior_gas.merge(expelled_gas) + + +// - large integrated tank - // **works** +/obj/item/integrated_circuit/atmospherics/tank/large + name = "large integrated tank" + desc = "A less small tank for the storage of gases." + volume = 9 + size = 12 + spawn_flags = IC_SPAWN_RESEARCH + + +// - freezer tank - // **works** +/obj/item/integrated_circuit/atmospherics/tank/freezer + name = "freezer tank" + desc = "Cools the gas it contains to a preset temperature." + volume = 6 + size = 8 + inputs = list( + "target temperature" = IC_PINTYPE_NUMBER, + "on" = IC_PINTYPE_BOOLEAN + ) + inputs_default = list("1" = 300) + spawn_flags = IC_SPAWN_RESEARCH + var/temperature = 293.15 + var/heater_coefficient = 0.1 + +/obj/item/integrated_circuit/atmospherics/tank/freezer/on_data_written() + temperature = max(73.15,min(293.15,get_pin_data(IC_INPUT, 1))) + if(get_pin_data(IC_INPUT, 2)) + power_draw_idle = 30 + else + power_draw_idle = 0 + +/obj/item/integrated_circuit/atmospherics/tank/freezer/process() + var/tank_pressure = air_contents.return_pressure() + set_pin_data(IC_OUTPUT, 2, tank_pressure) + push_data() + + //Cool the tank if the power is on and the temp is above + if(!power_draw_idle || air_contents.temperature < temperature) + return + + air_contents.temperature = max(73.15,air_contents.temperature - (air_contents.temperature - temperature) * heater_coefficient) + + +// - heater tank - // **works** +/obj/item/integrated_circuit/atmospherics/tank/freezer/heater + name = "heater tank" + desc = "Heats the gas it contains to a preset temperature." + volume = 6 + inputs = list( + "target temperature" = IC_PINTYPE_NUMBER, + "on" = IC_PINTYPE_BOOLEAN + ) + spawn_flags = IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/atmospherics/tank/freezer/heater/on_data_written() + temperature = max(293.15,min(573.15,get_pin_data(IC_INPUT, 1))) + if(get_pin_data(IC_INPUT, 2)) + power_draw_idle = 30 + else + power_draw_idle = 0 + +/obj/item/integrated_circuit/atmospherics/tank/freezer/heater/process() + var/tank_pressure = air_contents.return_pressure() + set_pin_data(IC_OUTPUT, 2, tank_pressure) + push_data() + + //Heat the tank if the power is on or its temperature is below what is set + if(!power_draw_idle || air_contents.temperature > temperature) + return + + air_contents.temperature = min(573.15,air_contents.temperature + (temperature - air_contents.temperature) * heater_coefficient) + + +// - atmospheric cooler - // **works** +/obj/item/integrated_circuit/atmospherics/cooler + name = "atmospheric cooler circuit" + desc = "Cools the air around it." + volume = 6 + size = 13 + spawn_flags = IC_SPAWN_RESEARCH + inputs = list( + "target temperature" = IC_PINTYPE_NUMBER, + "on" = IC_PINTYPE_BOOLEAN + ) + var/temperature = 293.15 + var/heater_coefficient = 0.1 + +/obj/item/integrated_circuit/atmospherics/cooler/Initialize() + air_contents = new(volume) + START_PROCESSING(SSobj, src) + . = ..() + +/obj/item/integrated_circuit/atmospherics/cooler/Destroy() + STOP_PROCESSING(SSobj, src) + . = ..() + +/obj/item/integrated_circuit/atmospherics/cooler/on_data_written() + temperature = max(243.15,min(293.15,get_pin_data(IC_INPUT, 1))) + if(get_pin_data(IC_INPUT, 2)) + power_draw_idle = 30 + else + power_draw_idle = 0 + +/obj/item/integrated_circuit/atmospherics/cooler/process() + set_pin_data(IC_OUTPUT, 2, air_contents.return_pressure()) + push_data() + + + //Get the turf you're on and its gas mixture + var/turf/current_turf = get_turf(src) + if(!current_turf) + return + + var/datum/gas_mixture/turf_air = current_turf.return_air() + if(!power_draw_idle || turf_air.temperature < temperature) + return + + //Cool the gas + turf_air.temperature = max(243.15,turf_air.temperature - (turf_air.temperature - temperature) * heater_coefficient) + + +// - atmospheric heater - // **works** +/obj/item/integrated_circuit/atmospherics/cooler/heater + name = "atmospheric heater circuit" + desc = "Heats the air around it." + +/obj/item/integrated_circuit/atmospherics/cooler/heater/on_data_written() + temperature = max(293.15,min(323.15,get_pin_data(IC_INPUT, 1))) + if(get_pin_data(IC_INPUT, 2)) + power_draw_idle = 30 + else + power_draw_idle = 0 + +/obj/item/integrated_circuit/atmospherics/cooler/heater/process() + set_pin_data(IC_OUTPUT, 2, air_contents.return_pressure()) + push_data() + + //Get the turf and its air mixture + var/turf/current_turf = get_turf(src) + if(!current_turf) + return + + var/datum/gas_mixture/turf_air = current_turf.return_air() + if(!power_draw_idle || turf_air.temperature > temperature) + return + + //Heat the gas + turf_air.temperature = min(323.15,turf_air.temperature + (temperature - turf_air.temperature) * heater_coefficient) + + +// - tank slot - // **works** +/obj/item/integrated_circuit/input/tank_slot + category_text = "Atmospherics" + cooldown_per_use = 1 + name = "tank slot" + desc = "Lets you add a tank to your assembly and remove it even when the assembly is closed." + extended_desc = "It can help you extract gases easier." + complexity = 25 + size = 30 + inputs = list() + outputs = list( + "pressure used" = IC_PINTYPE_NUMBER, + "current tank" = IC_PINTYPE_REF + ) + activators = list( + "push ref" = IC_PINTYPE_PULSE_IN, + "on insert" = IC_PINTYPE_PULSE_OUT, + "on remove" = IC_PINTYPE_PULSE_OUT + ) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + + can_be_asked_input = TRUE + demands_object_input = TRUE + can_input_object_when_closed = TRUE + + var/obj/item/tank/internals/current_tank + +/obj/item/integrated_circuit/input/tank_slot/Initialize() + START_PROCESSING(SSobj, src) + . = ..() + +/obj/item/integrated_circuit/input/tank_slot/process() + push_pressure() + +/obj/item/integrated_circuit/input/tank_slot/attackby(var/obj/item/tank/internals/I, var/mob/living/user) + //Check if it truly is a tank + if(!istype(I,/obj/item/tank/internals)) + to_chat(user,"The [I.name] doesn't seem to fit in here.") + return + + //Check if there is no other tank already inside + if(current_tank) + to_chat(user,"There is already a gas tank inside.") + return + + //The current tank is the one we just attached, its location is inside the circuit + current_tank = I + user.transferItemToLoc(I,src) + to_chat(user,"You put the [I.name] inside the tank slot.") + + //Set the pin to a weak reference of the current tank + push_pressure() + set_pin_data(IC_OUTPUT, 2, WEAKREF(current_tank)) + push_data() + do_work(1) + + +/obj/item/integrated_circuit/input/tank_slot/ask_for_input(mob/user) + attack_self(user) + +/obj/item/integrated_circuit/input/tank_slot/attack_self(mob/user) + //Check if no tank attached + if(!current_tank) + to_chat(user, "There is currently no tank attached.") + return + + //Remove tank and put in user's hands/location + to_chat(user, "You take [current_tank] out of the tank slot.") + user.put_in_hands(current_tank) + current_tank = null + + //Remove tank reference + push_pressure() + set_pin_data(IC_OUTPUT, 2, null) + push_data() + do_work(2) + +/obj/item/integrated_circuit/input/tank_slot/do_work() + set_pin_data(IC_OUTPUT, 2, WEAKREF(current_tank)) + push_data() + +/obj/item/integrated_circuit/input/tank_slot/proc/push_pressure() + if(!current_tank) + set_pin_data(IC_OUTPUT, 1, 0) + return + + var/datum/gas_mixture/tank_air = current_tank.return_air() + if(!tank_air) + set_pin_data(IC_OUTPUT, 1, 0) + return + + set_pin_data(IC_OUTPUT, 1, tank_air.return_pressure()) + push_data() + + +#undef SOURCE_TO_TARGET +#undef TARGET_TO_SOURCE +#undef PUMP_EFFICIENCY +#undef TANK_FAILURE_PRESSURE +#undef PUMP_MAX_PRESSURE +#undef PUMP_MAX_VOLUME diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 20d405b71d..6e8b0cb777 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -1218,4 +1218,95 @@ activate_pin(2) else return FALSE - return TRUE \ No newline at end of file + return TRUE + + +//Hippie Ported Code-------------------------------------------------------------------------------------------------------- + + + //Adding some color to cards aswell, because why not +/obj/item/card/data/attackby(obj/item/I, mob/living/user) + if(istype(I, /obj/item/integrated_electronics/detailer)) + var/obj/item/integrated_electronics/detailer/D = I + detail_color = D.detail_color + update_icon() + return ..() + + + +// -Inputlist- // +/obj/item/integrated_circuit/input/selection + name = "selection circuit" + desc = "This circuit lets you choose between different strings from a selection." + extended_desc = "This circuit lets you choose between up to 4 different values from selection of up to 8 strings that you can set. Null values are ignored and the chosen value is put out in selected." + icon_state = "addition" + can_be_asked_input = 1 + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + inputs = list( + "A" = IC_PINTYPE_STRING, + "B" = IC_PINTYPE_STRING, + "C" = IC_PINTYPE_STRING, + "D" = IC_PINTYPE_STRING, + "E" = IC_PINTYPE_STRING, + "F" = IC_PINTYPE_STRING, + "G" = IC_PINTYPE_STRING, + "H" = IC_PINTYPE_STRING + ) + activators = list( + "on selected" = IC_PINTYPE_PULSE_OUT + ) + outputs = list( + "selected" = IC_PINTYPE_STRING + ) + +/obj/item/integrated_circuit/input/selection/ask_for_input(mob/user) + var/list/selection = list() + for(var/k in 1 to inputs.len) + var/I = get_pin_data(IC_INPUT, k) + if(istext(I)) + selection.Add(I) + var/selected = input(user,"Choose input.","Selection") in selection + if(!selected) + return + set_pin_data(IC_OUTPUT, 1, selected) + push_data() + activate_pin(1) + + +// -storage examiner- // **works** +/obj/item/integrated_circuit/input/storage_examiner + name = "storage examiner circuit" + desc = "This circuit lets you scan a storage's content. (backpacks, toolboxes etc.)" + extended_desc = "The items are put out as reference, which makes it possible to interact with them. Additionally also gives the amount of items." + icon_state = "grabber" + can_be_asked_input = 1 + complexity = 6 + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + inputs = list( + "storage" = IC_PINTYPE_REF + ) + activators = list( + "examine" = IC_PINTYPE_PULSE_IN, + "on examined" = IC_PINTYPE_PULSE_OUT + ) + outputs = list( + "item amount" = IC_PINTYPE_NUMBER, + "item list" = IC_PINTYPE_LIST + ) + power_draw_per_use = 85 + +/obj/item/integrated_circuit/input/storage_examiner/do_work() + var/obj/item/storage = get_pin_data_as_type(IC_INPUT, 1, /obj/item) + if(!istype(storage,/obj/item/storage)) + return + + set_pin_data(IC_OUTPUT, 1, storage.contents.len) + + var/list/regurgitated_contents = list() + for(var/obj/o in storage.contents) + regurgitated_contents.Add(WEAKREF(o)) + + + set_pin_data(IC_OUTPUT, 2, regurgitated_contents) + push_data() + activate_pin(2) \ No newline at end of file diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index 1c76c7648c..f63d58b707 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -677,3 +677,140 @@ GET_COMPONENT(materials, /datum/component/material_container) materials.retrieve_all() .=..() + + +//Hippie Ported Code-------------------------------------------------------------------------------------------------------- + + +// - inserter circuit - // +/obj/item/integrated_circuit/manipulation/inserter + name = "inserter" + desc = "A nimble circuit that puts stuff inside a storage like a backpack and can take it out aswell." + icon_state = "grabber" + extended_desc = "This circuit accepts a reference to an object to be inserted or extracted depending on mode. If a storage is given for extraction, the extracted item will be put in the new storage. Modes: 1 insert, 0 to extract." + w_class = WEIGHT_CLASS_SMALL + size = 3 + cooldown_per_use = 5 + complexity = 10 + inputs = list("target object" = IC_PINTYPE_REF, "target container" = IC_PINTYPE_REF,"mode" = IC_PINTYPE_NUMBER) + activators = list("pulse in" = IC_PINTYPE_PULSE_IN,"pulse out" = IC_PINTYPE_PULSE_OUT) + spawn_flags = IC_SPAWN_RESEARCH + action_flags = IC_ACTION_COMBAT + power_draw_per_use = 20 + var/max_items = 10 + +/obj/item/integrated_circuit/manipulation/inserter/do_work() + //There shouldn't be any target required to eject all contents + var/obj/item/target_obj = get_pin_data_as_type(IC_INPUT, 1, /obj/item) + if(!target_obj) + return + + var/distance = get_dist(get_turf(src),get_turf(target_obj)) + if(distance > 1 || distance < 0) + return + + var/obj/item/storage/container = get_pin_data_as_type(IC_INPUT, 2, /obj/item) + var/mode = get_pin_data(IC_INPUT, 3) + switch(mode) + if(1) //Not working + if(!container || !istype(container,/obj/item/storage) || !Adjacent(container)) + return + + GET_COMPONENT_FROM(STR, /datum/component/storage, container) + if(!STR) + return + + STR.attackby(src, target_obj) + + else + GET_COMPONENT_FROM(STR, /datum/component/storage, target_obj.loc) + if(!STR) + return + + if(!container || !istype(container,/obj/item/storage) || !Adjacent(container)) + STR.remove_from_storage(target_obj,drop_location()) + else + STR.remove_from_storage(target_obj,container) + +// Renamer circuit. Renames the assembly it is in. Useful in cooperation with telecomms-based circuits. +/obj/item/integrated_circuit/manipulation/renamer + name = "renamer" + desc = "A small circuit that renames the assembly it is in. Useful paired with speech-based circuits." + icon_state = "internalbm" + extended_desc = "This circuit accepts a string as input, and can be pulsed to rewrite the current assembly's name with said string. On success, it pulses the default pulse-out wire." + inputs = list("name" = IC_PINTYPE_STRING) + outputs = list("current name" = IC_PINTYPE_STRING) + activators = list("rename" = IC_PINTYPE_PULSE_IN,"get name" = IC_PINTYPE_PULSE_IN,"pulse out" = IC_PINTYPE_PULSE_OUT) + power_draw_per_use = 1 + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/manipulation/renamer/do_work(var/n) + if(!assembly) + return + switch(n) + if(1) + var/new_name = get_pin_data(IC_INPUT, 1) + if(new_name) + assembly.name = new_name + + else + set_pin_data(IC_OUTPUT, 1, assembly.name) + push_data() + + activate_pin(3) + + + +// - redescribing circuit - // +/obj/item/integrated_circuit/manipulation/redescribe + name = "redescriber" + desc = "Takes any string as an input and will set it as the assembly's description." + extended_desc = "Strings should can be of any length." + icon_state = "speaker" + cooldown_per_use = 10 + complexity = 3 + inputs = list("text" = IC_PINTYPE_STRING) + outputs = list("description" = IC_PINTYPE_STRING) + activators = list("redescribe" = IC_PINTYPE_PULSE_IN,"get description" = IC_PINTYPE_PULSE_IN,"pulse out" = IC_PINTYPE_PULSE_OUT) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/manipulation/redescribe/do_work(var/n) + if(!assembly) + return + + switch(n) + if(1) + assembly.desc = get_pin_data(IC_INPUT, 1) + + else + set_pin_data(IC_OUTPUT, 1, assembly.desc) + push_data() + + activate_pin(3) + +// - repainting circuit - // +/obj/item/integrated_circuit/manipulation/repaint + name = "auto-repainter" + desc = "There's an oddly high amount of spraying cans fitted right inside this circuit." + extended_desc = "Takes a value in hexadecimal and uses it to repaint the assembly it is in." + cooldown_per_use = 10 + complexity = 3 + inputs = list("color" = IC_PINTYPE_COLOR) + outputs = list("current color" = IC_PINTYPE_COLOR) + activators = list("repaint" = IC_PINTYPE_PULSE_IN,"get color" = IC_PINTYPE_PULSE_IN,"pulse out" = IC_PINTYPE_PULSE_OUT) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/manipulation/repaint/do_work(var/n) + if(!assembly) + return + + switch(n) + if(1) + assembly.detail_color = get_pin_data(IC_INPUT, 1) + assembly.update_icon() + + else + set_pin_data(IC_OUTPUT, 1, assembly.detail_color) + push_data() + + activate_pin(3) \ No newline at end of file diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index 0ad2714e28..86efc4c74a 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -385,4 +385,30 @@ else assembly.prefered_hud_icon = "hudstat" //update the diagnostic hud - assembly.diag_hud_set_circuitstat() \ No newline at end of file + assembly.diag_hud_set_circuitstat() + + +//Hippie Ported Code-------------------------------------------------------------------------------------------------------- + + + +/obj/item/radio/headset/integrated + +/obj/item/integrated_circuit/output/screen/large + name = "medium screen" + +/obj/item/integrated_circuit/output/screen/extralarge // the subtype is called "extralarge" because tg brought back medium screens and they named the subtype /screen/large + name = "large screen" + desc = "Takes any data type as an input and displays it to the user upon examining, and to all nearby beings when pulsed." + icon_state = "screen_large" + power_draw_per_use = 40 + cooldown_per_use = 10 + +/obj/item/integrated_circuit/output/screen/extralarge/do_work() + ..() + var/obj/O = assembly ? get_turf(assembly) : loc + O.visible_message("[icon2html(O.icon, world, O.icon_state)] [stuff_to_display]") + if(assembly) + assembly.investigate_log("displayed \"[html_encode(stuff_to_display)]\" with [type].", INVESTIGATE_CIRCUIT) + else + investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT) \ No newline at end of file diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index b8f326f389..af71c8605f 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -538,3 +538,318 @@ reagents.handle_reactions() set_pin_data(IC_OUTPUT, 3, reagents.chem_temp) push_data() + + +//Hippie Ported Code-------------------------------------------------------------------------------------------------------- + + +/obj/item/integrated_circuit/reagent/smoke + name = "smoke generator" + desc = "Unlike most electronics, creating smoke is completely intentional." + icon_state = "smoke" + extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \ + into the smoke clouds when activated. The reagents are consumed when the smoke is made." + ext_cooldown = 1 + volume = 100 + complexity = 20 + cooldown_per_use = 1 SECONDS + inputs = list() + outputs = list( + "volume used" = IC_PINTYPE_NUMBER, + "self reference" = IC_PINTYPE_SELFREF + ) + activators = list( + "create smoke" = IC_PINTYPE_PULSE_IN, + "on smoked" = IC_PINTYPE_PULSE_OUT, + "push ref" = IC_PINTYPE_PULSE_IN + ) + spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 20 + var/smoke_radius = 5 + var/notified = FALSE + +/obj/item/integrated_circuit/reagent/smoke/on_reagent_change(changetype) + //reset warning only if we have reagents now + if(changetype == ADD_REAGENT) + notified = FALSE + push_vol() +/obj/item/integrated_circuit/reagent/smoke/do_work(ord) + switch(ord) + if(1) + if(!reagents || (reagents.total_volume < IC_SMOKE_REAGENTS_MINIMUM_UNITS)) + return + var/location = get_turf(src) + var/datum/effect_system/smoke_spread/chem/S = new + S.attach(location) + playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) + if(S) + S.set_up(reagents, smoke_radius, location, notified) + if(!notified) + notified = TRUE + S.start() + reagents.clear_reagents() + activate_pin(2) + if(3) + set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) + push_data() + +// - Integrated extinguisher - // +/obj/item/integrated_circuit/reagent/extinguisher + name = "integrated extinguisher" + desc = "This circuit sprays any of its contents out like an extinguisher." + icon_state = "injector" + extended_desc = "This circuit can hold up to 30 units of any given chemicals. On each use, it sprays these reagents like a fire extinguisher." + + volume = 30 + + complexity = 20 + cooldown_per_use = 6 SECONDS + inputs = list( + "target X rel" = IC_PINTYPE_NUMBER, + "target Y rel" = IC_PINTYPE_NUMBER + ) + outputs = list( + "volume" = IC_PINTYPE_NUMBER, + "self reference" = IC_PINTYPE_SELFREF + ) + activators = list( + "spray" = IC_PINTYPE_PULSE_IN, + "on sprayed" = IC_PINTYPE_PULSE_OUT, + "on fail" = IC_PINTYPE_PULSE_OUT + ) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 15 + var/busy = FALSE + +/obj/item/integrated_circuit/reagent/extinguisher/Initialize() + .=..() + set_pin_data(IC_OUTPUT,2, src) + +/obj/item/integrated_circuit/reagent/extinguisher/on_reagent_change(changetype) + push_vol() + +/obj/item/integrated_circuit/reagent/extinguisher/do_work() + //Check if enough volume + set_pin_data(IC_OUTPUT, 1, reagents.total_volume) + if(!reagents || reagents.total_volume < 5 || busy) + push_data() + activate_pin(3) + return + + playsound(loc, 'sound/effects/extinguish.ogg', 75, 1, -3) + //Get the tile on which the water particle spawns + var/turf/Spawnpoint = get_turf(src) + if(!Spawnpoint) + push_data() + activate_pin(3) + return + + //Get direction and target turf for each water particle + var/turf/T = locate(Spawnpoint.x + get_pin_data(IC_INPUT, 1),Spawnpoint.y + get_pin_data(IC_INPUT, 2),Spawnpoint.z) + if(!T) + push_data() + activate_pin(3) + return + var/direction = get_dir(Spawnpoint, T) + var/turf/T1 = get_step(T,turn(direction, 90)) + var/turf/T2 = get_step(T,turn(direction, -90)) + var/list/the_targets = list(T,T1,T2) + busy = TRUE + + // Create list with particles and their targets + var/list/water_particles=list() + for(var/a=0, a<5, a++) + var/obj/effect/particle_effect/water/W = new /obj/effect/particle_effect/water(get_turf(src)) + water_particles[W] = pick(the_targets) + var/datum/reagents/R = new/datum/reagents(5) + W.reagents = R + R.my_atom = W + reagents.trans_to(W,1) + + //Make em move dat ass, hun + addtimer(CALLBACK(src, /obj/item/integrated_circuit/reagent/extinguisher/proc/move_particles, water_particles), 2) + +//This whole proc is a loop +/obj/item/integrated_circuit/reagent/extinguisher/proc/move_particles(var/list/particles, var/repetitions=0) + //Check if there's anything in here first + if(!particles || particles.len == 0) + return + // Second loop: Get all the water particles and make them move to their target + for(var/obj/effect/particle_effect/water/W in particles) + var/turf/my_target = particles[W] + if(!W) + continue + step_towards(W,my_target) + if(!W.reagents) + continue + W.reagents.reaction(get_turf(W)) + for(var/A in get_turf(W)) + W.reagents.reaction(A) + if(W.loc == my_target) + break + if(repetitions < 4) + repetitions++ //Can't have math operations in addtimer(CALLBACK()) + addtimer(CALLBACK(src, /obj/item/integrated_circuit/reagent/extinguisher/proc/move_particles, particles, repetitions), 2) + else + push_data() + activate_pin(2) + busy = FALSE + + +// - Drain circuit - // +/obj/item/integrated_circuit/reagent/drain + name = "chemical drain circuit" + desc = "This circuit either eliminates reagents by creating a puddle or can suck up chemicals on tiles." + icon_state = "injector" + extended_desc = "Set mode to FALSE to eliminate reagents and TRUE to drain." + + volume = 20 + + complexity = 10 + inputs = list( + "mode" = IC_PINTYPE_BOOLEAN + ) + outputs = list( + "volume" = IC_PINTYPE_NUMBER, + "self reference" = IC_PINTYPE_SELFREF + ) + activators = list( + "drain" = IC_PINTYPE_PULSE_IN, + "on drained" = IC_PINTYPE_PULSE_OUT, + "on fail" = IC_PINTYPE_PULSE_OUT + ) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 15 + + +/obj/item/integrated_circuit/reagent/drain/Initialize() + .=..() + set_pin_data(IC_OUTPUT,2, src) + + +/obj/item/integrated_circuit/reagent/drain/do_work() + if(get_pin_data(IC_OUTPUT, 1, reagents.total_volume)) + if(!reagents || !reagents.total_volume) + push_data() + activate_pin(3) + return + // Put the reagents on the floortile the assembly is on + reagents.reaction(get_turf(src)) + reagents.clear_reagents() + push_data() + activate_pin(2) + return + + else + if(reagents) + if(reagents.total_volume >= volume) + push_data() + activate_pin(3) + return + // Favorably, drain it from a chemicals pile, else, try something different + var/obj/effect/decal/cleanable/drainedchems = locate(/obj/effect/decal/cleanable) in get_turf(src) + if(!drainedchems || !drainedchems.reagents || drainedchems.reagents.total_volume == 0) + push_data() + activate_pin(3) + return + drainedchems.reagents.trans_to(src, 30, 0.5) + if(drainedchems.reagents.total_volume == 0) + qdel(drainedchems) + push_data() + activate_pin(2) + + +/obj/item/integrated_circuit/reagent/drain/on_reagent_change(changetype) + push_vol() + + +// - Beaker Connector - // +/obj/item/integrated_circuit/input/beaker_connector + category_text = "Reagent" + cooldown_per_use = 1 + name = "beaker slot" + desc = "Lets you add a beaker to your assembly and remove it even when the assembly is closed." + icon_state = "reagent_storage" + extended_desc = "It can help you extract reagents easier." + complexity = 4 + + inputs = list() + outputs = list( + "volume used" = IC_PINTYPE_NUMBER, + "current beaker" = IC_PINTYPE_REF + ) + activators = list( + "on insert" = IC_PINTYPE_PULSE_OUT, + "on remove" = IC_PINTYPE_PULSE_OUT, + "push ref" = IC_PINTYPE_PULSE_OUT + ) + + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + can_be_asked_input = TRUE + demands_object_input = TRUE + can_input_object_when_closed = TRUE + + var/obj/item/reagent_containers/glass/beaker/current_beaker + + +/obj/item/integrated_circuit/input/beaker_connector/attackby(var/obj/item/reagent_containers/I, var/mob/living/user) + //Check if it truly is a reagent container + if(!istype(I,/obj/item/reagent_containers/glass/beaker)) + to_chat(user,"The [I.name] doesn't seem to fit in here.") + return + + //Check if there is no other beaker already inside + if(current_beaker) + to_chat(user,"There is already a reagent container inside.") + return + + //The current beaker is the one we just attached, its location is inside the circuit + current_beaker = I + user.transferItemToLoc(I,src) + + to_chat(user,"You put the [I.name] inside the beaker connector.") + + //Set the pin to a weak reference of the current beaker + push_vol() + set_pin_data(IC_OUTPUT, 2, WEAKREF(current_beaker)) + push_data() + activate_pin(1) + activate_pin(3) + + +/obj/item/integrated_circuit/input/beaker_connector/ask_for_input(mob/user) + attack_self(user) + + +/obj/item/integrated_circuit/input/beaker_connector/attack_self(mob/user) + //Check if no beaker attached + if(!current_beaker) + to_chat(user, "There is currently no beaker attached.") + return + + //Remove beaker and put in user's hands/location + to_chat(user, "You take [current_beaker] out of the beaker connector.") + user.put_in_hands(current_beaker) + current_beaker = null + //Remove beaker reference + push_vol() + set_pin_data(IC_OUTPUT, 2, null) + push_data() + activate_pin(2) + activate_pin(3) + + +/obj/item/integrated_circuit/input/beaker_connector/proc/push_vol() + var/beakerVolume = 0 + if(current_beaker) + beakerVolume = current_beaker.reagents.total_volume + + set_pin_data(IC_OUTPUT, 1, beakerVolume) + push_data() + + +/obj/item/reagent_containers/glass/beaker/on_reagent_change() + ..() + if(istype(loc,/obj/item/integrated_circuit/input/beaker_connector)) + var/obj/item/integrated_circuit/input/beaker_connector/current_circuit = loc + current_circuit.push_vol() \ No newline at end of file diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm index bd93ae8314..b9bd4627c4 100644 --- a/code/modules/integrated_electronics/subtypes/smart.dm +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -114,3 +114,262 @@ set_pin_data(IC_OUTPUT, 2, Yn) push_data() activate_pin(2) + + +//Hippie Ported Code-------------------------------------------------------------------------------------------------------- + + + +// - MMI Tank - // +/obj/item/integrated_circuit/input/mmi_tank + name = "man-machine interface tank" + desc = "This circuit is just a jar filled with an artificial liquid mimicking the cerebrospinal fluid." + extended_desc = "This jar can hold 1 man-machine interface and let it take control of some basic functions of the assembly." + complexity = 29 + inputs = list("laws" = IC_PINTYPE_LIST) + outputs = list( + "man-machine interface" = IC_PINTYPE_REF, + "direction" = IC_PINTYPE_DIR, + "click target" = IC_PINTYPE_REF + ) + activators = list( + "move" = IC_PINTYPE_PULSE_OUT, + "left" = IC_PINTYPE_PULSE_OUT, + "right" = IC_PINTYPE_PULSE_OUT, + "up" = IC_PINTYPE_PULSE_OUT, + "down" = IC_PINTYPE_PULSE_OUT, + "leftclick" = IC_PINTYPE_PULSE_OUT, + "shiftclick" = IC_PINTYPE_PULSE_OUT, + "altclick" = IC_PINTYPE_PULSE_OUT, + "ctrlclick" = IC_PINTYPE_PULSE_OUT + ) + spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 150 + can_be_asked_input = TRUE + demands_object_input = TRUE + + var/obj/item/mmi/installed_brain + +/obj/item/integrated_circuit/input/mmi_tank/attackby(var/obj/item/mmi/O, var/mob/user) + if(!istype(O,/obj/item/mmi)) + to_chat(user,"You can't put that inside.") + return + if(installed_brain) + to_chat(user,"There's already a brain inside.") + return + user.transferItemToLoc(O,src) + installed_brain = O + can_be_asked_input = FALSE + to_chat(user, "You gently place \the man-machine interface inside the tank.") + to_chat(O, "You are slowly being placed inside the man-machine-interface tank.") + O.brainmob.remote_control=src + set_pin_data(IC_OUTPUT, 1, O) + +/obj/item/integrated_circuit/input/mmi_tank/attack_self(var/mob/user) + if(installed_brain) + RemoveBrain() + to_chat(user, "You slowly lift [installed_brain] out of the MMI tank.") + playsound(src, 'sound/items/Crowbar.ogg', 50, 1) + installed_brain = null + push_data() + else + to_chat(user, "You don't see any brain swimming in the tank.") + +/obj/item/integrated_circuit/input/mmi_tank/Destroy() + RemoveBrain() + ..() + +/obj/item/integrated_circuit/input/mmi_tank/relaymove(var/n,var/dir) + set_pin_data(IC_OUTPUT, 2, dir) + do_work(1) + switch(dir) + if(8) activate_pin(2) + if(4) activate_pin(3) + if(1) activate_pin(4) + if(2) activate_pin(5) + +/obj/item/integrated_circuit/input/mmi_tank/do_work(var/n) + push_data() + activate_pin(n) + +/obj/item/integrated_circuit/input/mmi_tank/proc/RemoveBrain() + if(installed_brain) + can_be_asked_input = TRUE + installed_brain.forceMove(drop_location()) + set_pin_data(IC_OUTPUT, 1, WEAKREF(null)) + if(installed_brain.brainmob) + installed_brain.brainmob.remote_control = null + ..() + + +//Brain changes +/mob/living/brain/var/check_bot_self = FALSE + +/mob/living/brain/ClickOn(atom/A, params) + ..() + if(!istype(remote_control,/obj/item/integrated_circuit/input/mmi_tank)) + return + var/obj/item/integrated_circuit/input/mmi_tank/brainholder=remote_control + brainholder.set_pin_data(IC_OUTPUT, 3, A) + var/list/modifiers = params2list(params) + + if(modifiers["shift"]) + brainholder.do_work(7) + return + if(modifiers["alt"]) + brainholder.do_work(8) + return + if(modifiers["ctrl"]) + brainholder.do_work(9) + return + + if(istype(A,/obj/item/electronic_assembly)) + var/obj/item/electronic_assembly/CheckedAssembly = A + + if(brainholder in CheckedAssembly.assembly_components) + var/obj/item/electronic_assembly/holdingassembly=A + check_bot_self=TRUE + + if(holdingassembly.opened) + holdingassembly.ui_interact(src) + holdingassembly.attack_self(src) + check_bot_self=FALSE + return + + brainholder.do_work(6) + +/mob/living/brain/canUseTopic() + return check_bot_self + +/obj/item/integrated_circuit/smart/advanced_pathfinder/proc/hippie_xor_decrypt() + var/Ps = get_pin_data(IC_INPUT, 4) + if(!Ps) + return + var/list/Pl = json_decode(XorEncrypt(hextostr(Ps, TRUE), SScircuit.cipherkey)) + if(Pl&&islist(Pl)) + idc.access = Pl + +// - pAI connector circuit - // +/obj/item/integrated_circuit/input/pAI_connector + name = "pAI connector circuit" + desc = "This circuit lets you fit in a personal artificial intelligence to give it some form of control over the bot." + extended_desc = "You can wire various functions to it." + complexity = 29 + inputs = list("laws" = IC_PINTYPE_LIST) + outputs = list( + "personal artificial intelligence" = IC_PINTYPE_REF, + "direction" = IC_PINTYPE_DIR, + "click target" = IC_PINTYPE_REF + ) + activators = list( + "move" = IC_PINTYPE_PULSE_OUT, + "left" = IC_PINTYPE_PULSE_OUT, + "right" = IC_PINTYPE_PULSE_OUT, + "up" = IC_PINTYPE_PULSE_OUT, + "down" = IC_PINTYPE_PULSE_OUT, + "leftclick" = IC_PINTYPE_PULSE_OUT, + "shiftclick" = IC_PINTYPE_PULSE_OUT, + "altclick" = IC_PINTYPE_PULSE_OUT, + "ctrlclick" = IC_PINTYPE_PULSE_OUT, + "shiftctrlclick" = IC_PINTYPE_PULSE_OUT + ) + spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 150 + can_be_asked_input = TRUE + demands_object_input = TRUE + + var/obj/item/paicard/installed_pai + +/obj/item/integrated_circuit/input/pAI_connector/attackby(var/obj/item/paicard/O, var/mob/user) + if(!istype(O,/obj/item/paicard)) + to_chat(user,"You can't put that inside.") + return + if(installed_pai) + to_chat(user,"There's already a pAI connected to this.") + return + user.transferItemToLoc(O,src) + installed_pai = O + can_be_asked_input = FALSE + to_chat(user, "You slowly connect the circuit's pins to the [installed_pai].") + to_chat(O, "You are slowly being connected to the pAI connector.") + O.pai.remote_control=src + set_pin_data(IC_OUTPUT, 1, O) + +/obj/item/integrated_circuit/input/pAI_connector/attack_self(var/mob/user) + if(installed_pai) + RemovepAI() + to_chat(user, "You slowly disconnect the circuit's pins from the [installed_pai].") + playsound(src, 'sound/items/Crowbar.ogg', 50, 1) + installed_pai = null + push_data() + else + to_chat(user, "The connection port is empty.") + +/obj/item/integrated_circuit/input/pAI_connector/relaymove(var/n,var/dir) + set_pin_data(IC_OUTPUT, 2, dir) + do_work(1) + switch(dir) + if(8) activate_pin(2) + if(4) activate_pin(3) + if(1) activate_pin(4) + if(2) activate_pin(5) + +/obj/item/integrated_circuit/input/pAI_connector/do_work(var/n) + push_data() + activate_pin(n) + + +/obj/item/integrated_circuit/input/pAI_connector/Destroy() + RemovepAI() + ..() + +/obj/item/integrated_circuit/input/pAI_connector/proc/RemovepAI() + if(installed_pai) + can_be_asked_input = TRUE + installed_pai.forceMove(drop_location()) + set_pin_data(IC_OUTPUT, 1, WEAKREF(null)) + installed_pai.pai.remote_control = null + ..() + + +//pAI changes +/mob/living/silicon/pai/var/check_bot_self = FALSE + +/mob/living/silicon/pai/ClickOn(atom/A, params) + ..() + if(!istype(remote_control,/obj/item/integrated_circuit/input/pAI_connector)) + return + var/obj/item/integrated_circuit/input/pAI_connector/paiholder=remote_control + paiholder.set_pin_data(IC_OUTPUT, 3, A) + var/list/modifiers = params2list(params) + + if(modifiers["shift"] && modifiers["ctrl"]) + paiholder.do_work(10) + return + if(modifiers["shift"]) + paiholder.do_work(7) + return + if(modifiers["alt"]) + paiholder.do_work(8) + return + if(modifiers["ctrl"]) + paiholder.do_work(9) + return + + if(istype(A,/obj/item/electronic_assembly)) + var/obj/item/electronic_assembly/CheckedAssembly = A + + if(paiholder in CheckedAssembly.assembly_components) + var/obj/item/electronic_assembly/holdingassembly=A + check_bot_self=TRUE + + if(holdingassembly.opened) + holdingassembly.ui_interact(src) + holdingassembly.attack_self(src) + check_bot_self=FALSE + return + + paiholder.do_work(6) + +/mob/living/silicon/pai/canUseTopic() + return check_bot_self \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index c43b1a7019..1cdc8cb21a 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1711,6 +1711,7 @@ #include "code\modules\hydroponics\grown\tobacco.dm" #include "code\modules\hydroponics\grown\tomato.dm" #include "code\modules\hydroponics\grown\towercap.dm" +#include "code\modules\integrated_electronics\_defines.dm" #include "code\modules\integrated_electronics\core\analyzer.dm" #include "code\modules\integrated_electronics\core\assemblies.dm" #include "code\modules\integrated_electronics\core\debugger.dm" @@ -1735,6 +1736,7 @@ #include "code\modules\integrated_electronics\passive\power.dm" #include "code\modules\integrated_electronics\subtypes\access.dm" #include "code\modules\integrated_electronics\subtypes\arithmetic.dm" +#include "code\modules\integrated_electronics\subtypes\atmospherics.dm" #include "code\modules\integrated_electronics\subtypes\converters.dm" #include "code\modules\integrated_electronics\subtypes\data_transfer.dm" #include "code\modules\integrated_electronics\subtypes\input.dm" From c8d51c4231580b998befe0425f9b156236d7560e Mon Sep 17 00:00:00 2001 From: deathride58 Date: Tue, 2 Apr 2019 01:11:29 -0400 Subject: [PATCH 124/142] Attempts to improve the performance of /mob/Stat() by using defines instead of procs for grabbing the current time --- code/__DEFINES/time.dm | 7 +++++++ code/__HELPERS/text_vr.dm | 4 ++-- code/__HELPERS/time.dm | 19 ------------------- code/controllers/subsystem/nightshift.dm | 2 +- code/datums/components/forensics.dm | 2 +- code/datums/explosion.dm | 2 +- code/datums/wires/airlock.dm | 4 ++-- code/game/machinery/computer/apc_control.dm | 2 +- code/game/machinery/computer/medical.dm | 2 +- code/game/machinery/computer/security.dm | 6 +++--- .../machinery/computer/telecrystalconsoles.dm | 2 +- code/game/machinery/doors/airlock.dm | 6 +++--- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/newscaster.dm | 4 ++-- code/game/mecha/mecha.dm | 2 +- code/game/objects/items/devices/PDA/PDA.dm | 2 +- code/game/objects/items/toys.dm | 2 +- code/game/world.dm | 8 ++++---- code/modules/NTNet/network.dm | 4 ++-- code/modules/admin/admin_investigate.dm | 2 +- code/modules/admin/verbs/adminhelp.dm | 6 +++--- .../changeling/powers/fakedeath.dm | 2 +- code/modules/assembly/doorcontrol.dm | 2 +- code/modules/detectivework/scanner.dm | 2 +- code/modules/error_handler/error_handler.dm | 4 ++-- code/modules/error_handler/error_viewer.dm | 10 +++++----- .../integrated_electronics/subtypes/time.dm | 2 +- code/modules/mining/machine_silo.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 8 ++++---- code/modules/mob/living/death.dm | 2 +- code/modules/mob/living/status_procs.dm | 2 +- code/modules/mob/mob.dm | 4 ++-- code/modules/mob/mob_helpers.dm | 2 +- .../NTNet/NTNRC/conversation.dm | 4 ++-- .../computers/item/computer.dm | 2 +- .../file_system/programs/card.dm | 2 +- .../file_system/programs/file_browser.dm | 2 +- 37 files changed, 65 insertions(+), 77 deletions(-) diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index 27f6eae8b6..c5d6f3051e 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -25,3 +25,10 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using #define DS2TICKS(DS) ((DS)/world.tick_lag) #define TICKS2DS(T) ((T) TICKS) + +#define GAMETIMESTAMP(format, wtime) time2text(wtime, format) +#define WORLDTIME2TEXT(format) GAMETIMESTAMP(format, world.time) +#define WORLDTIMEOFDAY2TEXT(format) GAMETIMESTAMP(format, world.timeofday) +#define TIME_STAMP(format, showds) showds ? "[WORLDTIMEOFDAY2TEXT(format)]:[world.timeofday % 10]" : WORLDTIMEOFDAY2TEXT(format) +#define STATION_TIME(display_only) ((((world.time - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0) +#define STATION_TIME_TIMESTAMP(format) time2text(STATION_TIME(TRUE), format) \ No newline at end of file diff --git a/code/__HELPERS/text_vr.dm b/code/__HELPERS/text_vr.dm index fadc7b4513..64e13ef65b 100644 --- a/code/__HELPERS/text_vr.dm +++ b/code/__HELPERS/text_vr.dm @@ -24,8 +24,8 @@ GLOBAL_LIST_EMPTY(whitelisted_species_list) /proc/log_mentor(text) GLOB.mentorlog.Add(text) - WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]MENTOR: [text]") + WRITE_FILE(GLOB.world_game_log, "\[[TIME_STAMP("hh:mm:ss", FALSE)]]MENTOR: [text]") /proc/log_looc(text) if (CONFIG_GET(flag/log_ooc)) - WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]LOOC: [text]") \ No newline at end of file + WRITE_FILE(GLOB.world_game_log, "\[[TIME_STAMP("hh:mm:ss", FALSE)]]LOOC: [text]") \ No newline at end of file diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 5fe65af8f3..200e1f907f 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -1,22 +1,3 @@ -//Returns the world time in english -/proc/worldtime2text() - return gameTimestamp("hh:mm:ss", world.time) - -/proc/time_stamp(format = "hh:mm:ss", show_ds) - var/time_string = time2text(world.timeofday, format) - return show_ds ? "[time_string]:[world.timeofday % 10]" : time_string - -/proc/gameTimestamp(format = "hh:mm:ss", wtime=null) - if(!wtime) - wtime = world.time - return time2text(wtime - GLOB.timezoneOffset, format) - -/proc/station_time(display_only = FALSE) - return ((((world.time - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0) - -/proc/station_time_timestamp(format = "hh:mm:ss") - return time2text(station_time(TRUE), format) - /proc/station_time_debug(force_set) if(isnum(force_set)) SSticker.gametime_offset = force_set diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index 325ba212c6..df406eed3c 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -26,7 +26,7 @@ SUBSYSTEM_DEF(nightshift) /datum/controller/subsystem/nightshift/proc/check_nightshift() var/emergency = GLOB.security_level >= SEC_LEVEL_RED var/announcing = TRUE - var/time = station_time() + var/time = STATION_TIME(FALSE) var/night_time = (time < nightshift_end_time) || (time > nightshift_start_time) if(high_security_mode != emergency) high_security_mode = emergency diff --git a/code/datums/components/forensics.dm b/code/datums/components/forensics.dm index 9a67d01c5c..c7a1f7eba5 100644 --- a/code/datums/components/forensics.dm +++ b/code/datums/components/forensics.dm @@ -130,7 +130,7 @@ var/mob/living/carbon/human/H = M if(H.gloves) hasgloves = "(gloves)" - var/current_time = time_stamp() + var/current_time = TIME_STAMP("hh:mm:ss", FALSE) if(!LAZYACCESS(hiddenprints, M.key)) LAZYSET(hiddenprints, M.key, "First: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]") else diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm index 0b3e431af6..fe16b9459f 100644 --- a/code/datums/explosion.dm +++ b/code/datums/explosion.dm @@ -92,7 +92,7 @@ GLOBAL_LIST_EMPTY(explosions) var/y0 = epicenter.y var/z0 = epicenter.z var/area/areatype = get_area(epicenter) - SSblackbox.record_feedback("associative", "explosion", 1, list("dev" = devastation_range, "heavy" = heavy_impact_range, "light" = light_impact_range, "flash" = flash_range, "flame" = flame_range, "orig_dev" = orig_dev_range, "orig_heavy" = orig_heavy_range, "orig_light" = orig_light_range, "x" = x0, "y" = y0, "z" = z0, "area" = areatype.type, "time" = time_stamp("YYYY-MM-DD hh:mm:ss", 1))) + SSblackbox.record_feedback("associative", "explosion", 1, list("dev" = devastation_range, "heavy" = heavy_impact_range, "light" = light_impact_range, "flash" = flash_range, "flame" = flame_range, "orig_dev" = orig_dev_range, "orig_heavy" = orig_heavy_range, "orig_light" = orig_light_range, "x" = x0, "y" = y0, "z" = z0, "area" = areatype.type, "time" = TIME_STAMP("YYYY-MM-DD hh:mm:ss", 1))) // Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. // Stereo users will also hear the direction of the explosion! diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 63140e6b25..26942a1ba6 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -79,7 +79,7 @@ if(!A.secondsElectrified) A.set_electrified(30) if(usr) - LAZYADD(A.shockedby, text("\[[time_stamp()]\] [key_name(usr)]")) + LAZYADD(A.shockedby, text("\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(usr)]")) log_combat(usr, A, "electrified") if(WIRE_SAFETY) A.safe = !A.safe @@ -134,7 +134,7 @@ if(A.secondsElectrified != -1) A.set_electrified(-1) if(usr) - LAZYADD(A.shockedby, text("\[[time_stamp()]\] [key_name(usr)]")) + LAZYADD(A.shockedby, text("\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(usr)]")) log_combat(usr, A, "electrified") if(WIRE_SAFETY) // Cut to disable safeties, mend to re-enable. A.safe = mend diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 8615af205b..e51d623c2f 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -197,7 +197,7 @@ /obj/machinery/computer/apc_control/proc/log_activity(log_text) var/op_string = operator && !(obj_flags & EMAGGED) ? operator : "\[NULL OPERATOR\]" - LAZYADD(logs, "([station_time_timestamp()]) [op_string] [log_text]") + LAZYADD(logs, "([STATION_TIME_TIMESTAMP("hh:mm:ss")]) [op_string] [log_text]") /mob/proc/using_power_flow_console() for(var/obj/machinery/computer/apc_control/A in range(1, src)) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index d65fb49161..8af83ae08e 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -493,7 +493,7 @@ var/counter = 1 while(src.active2.fields[text("com_[]", counter)]) counter++ - src.active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
    []", src.authenticated, src.rank, station_time_timestamp(), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) + src.active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
    []", src.authenticated, src.rank, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) else if(href_list["del_c"]) if((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index bacedad6c0..607f8dbe78 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -474,7 +474,7 @@ What a mess.*/ var/counter = 1 while(active2.fields[text("com_[]", counter)]) counter++ - active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
    []", src.authenticated, src.rank, station_time_timestamp(), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) + active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
    []", src.authenticated, src.rank, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) if("Delete Record (ALL)") if(active1) @@ -652,7 +652,7 @@ What a mess.*/ var/t2 = stripped_input(usr, "Please input minor crime details:", "Secure. records", "", null) if(!canUseSecurityRecordsConsole(usr, t1, null, a2)) return - var/crime = GLOB.data_core.createCrimeEntry(t1, t2, authenticated, station_time_timestamp()) + var/crime = GLOB.data_core.createCrimeEntry(t1, t2, authenticated, STATION_TIME_TIMESTAMP("hh:mm:ss")) GLOB.data_core.addMinorCrime(active1.fields["id"], crime) investigate_log("New Minor Crime: [t1]: [t2] | Added to [active1.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) if("mi_crim_delete") @@ -667,7 +667,7 @@ What a mess.*/ var/t2 = stripped_input(usr, "Please input major crime details:", "Secure. records", "", null) if(!canUseSecurityRecordsConsole(usr, t1, null, a2)) return - var/crime = GLOB.data_core.createCrimeEntry(t1, t2, authenticated, station_time_timestamp()) + var/crime = GLOB.data_core.createCrimeEntry(t1, t2, authenticated, STATION_TIME_TIMESTAMP("hh:mm:ss")) GLOB.data_core.addMajorCrime(active1.fields["id"], crime) investigate_log("New Major Crime: [t1]: [t2] | Added to [active1.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) if("ma_crim_delete") diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 43f84656f9..692bc8f038 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -136,7 +136,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E var/list/transferlog = list() /obj/machinery/computer/telecrystals/boss/proc/logTransfer(logmessage) - transferlog += ("[station_time_timestamp()] [logmessage]") + transferlog += ("[STATION_TIME_TIMESTAMP("hh:mm:ss")] [logmessage]") /obj/machinery/computer/telecrystals/boss/proc/scanUplinkers() for(var/obj/machinery/computer/telecrystals/uplinker/A in urange(scanrange, src.loc)) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 3d7e8dd00e..0183fcecd4 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1327,7 +1327,7 @@ bolt() //Bolt it! set_electrified(ELECTRIFIED_PERMANENT) //Shock it! if(origin) - LAZYADD(shockedby, "\[[time_stamp()]\] [key_name(origin)]") + LAZYADD(shockedby, "\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(origin)]") /obj/machinery/door/airlock/disable_lockdown() @@ -1596,7 +1596,7 @@ if(wires.is_cut(WIRE_SHOCK)) to_chat(user, "The electrification wire has been cut") else - LAZYADD(shockedby, "\[[time_stamp()]\] [key_name(user)]") + LAZYADD(shockedby, "\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(user)]") log_combat(user, src, "electrified") set_electrified(AI_ELECTRIFY_DOOR_TIME) @@ -1606,7 +1606,7 @@ if(wires.is_cut(WIRE_SHOCK)) to_chat(user, "The electrification wire has been cut") else - LAZYADD(shockedby, text("\[[time_stamp()]\] [key_name(user)]")) + LAZYADD(shockedby, text("\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(user)]")) log_combat(user, src, "electrified") set_electrified(ELECTRIFIED_PERMANENT) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 9c01c186e1..a2da7de29a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -223,7 +223,7 @@ if(prob(severity*10 - 20)) if(secondsElectrified == 0) secondsElectrified = -1 - LAZYADD(shockedby, "\[[time_stamp()]\]EM Pulse") + LAZYADD(shockedby, "\[[TIME_STAMP("hh:mm:ss", FALSE)]\]EM Pulse") addtimer(CALLBACK(src, .proc/unelectrify), 300) /obj/machinery/door/proc/unelectrify() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 86e8fc8af5..c37c607a6e 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -122,7 +122,7 @@ GLOBAL_LIST_EMPTY(allCasters) var/datum/newscaster/feed_message/newMsg = new /datum/newscaster/feed_message newMsg.author = author newMsg.body = msg - newMsg.time_stamp = "[station_time_timestamp()]" + newMsg.time_stamp = "[STATION_TIME_TIMESTAMP("hh:mm:ss")]" newMsg.is_admin_message = adminMessage newMsg.locked = !allow_comments if(picture) @@ -696,7 +696,7 @@ GLOBAL_LIST_EMPTY(allCasters) var/datum/newscaster/feed_comment/FC = new/datum/newscaster/feed_comment FC.author = scanned_user FC.body = cominput - FC.time_stamp = station_time_timestamp() + FC.time_stamp = STATION_TIME_TIMESTAMP("hh:mm:ss") FM.comments += FC usr.log_message("(as [scanned_user]) commented on message [FM.returnBody(-1)] -- [FC.body]", LOG_COMMENT) updateUsrDialog() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index efa1b44445..d5de4a4898 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1017,7 +1017,7 @@ /obj/mecha/log_message(message as text, message_type=LOG_GAME, color=null, log_globally) log.len++ - log[log.len] = list("time"="[station_time_timestamp()]","date","year"="[GLOB.year_integer+540]","message"="[color?"":null][message][color?"":null]") + log[log.len] = list("time"="[STATION_TIME_TIMESTAMP("hh:mm:ss")]","date","year"="[GLOB.year_integer+540]","message"="[color?"":null][message][color?"":null]") ..() return log.len diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index fc4bc32719..9ff717816c 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -220,7 +220,7 @@ GLOBAL_LIST_EMPTY(PDAs) dat += text("ID: [id ? "[id.registered_name], [id.assignment]" : "----------"]") dat += text("
    [id ? "Update PDA Info" : ""]

    ") - dat += "[station_time_timestamp()]
    " //:[world.time / 100 % 6][world.time / 100 % 10]" + dat += "[STATION_TIME_TIMESTAMP("hh:mm:ss")]
    " //:[world.time / 100 % 6][world.time / 100 % 10]" dat += "[time2text(world.realtime, "MMM DD")] [GLOB.year_integer+540]" dat += "

    " diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 7aaee7c5d4..eabd9f1968 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1089,7 +1089,7 @@ /obj/item/toy/clockwork_watch/examine(mob/user) ..() - to_chat(user, "Station Time: [station_time_timestamp()]") + to_chat(user, "Station Time: [STATION_TIME_TIMESTAMP("hh:mm:ss")]") /* * Toy Dagger diff --git a/code/game/world.dm b/code/game/world.dm index d8576206dd..dedf822597 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -6,7 +6,7 @@ GLOBAL_VAR(restart_counter) //So subsystems globals exist, but are not initialised /world/New() - log_world("World loaded at [time_stamp()]!") + log_world("World loaded at [TIME_STAMP("hh:mm:ss", FALSE)]!") SetupExternalRSC() @@ -90,7 +90,7 @@ GLOBAL_VAR(restart_counter) GLOB.picture_logging_prefix += "R_[GLOB.round_id]_" GLOB.picture_log_directory += "[GLOB.round_id]" else - var/timestamp = replacetext(time_stamp(), ":", ".") + var/timestamp = replacetext(TIME_STAMP("hh:mm:ss", FALSE), ":", ".") GLOB.log_directory += "[timestamp]" GLOB.picture_log_directory += "[timestamp]" GLOB.picture_logging_prefix += "T_[timestamp]_" @@ -226,11 +226,11 @@ GLOBAL_VAR(restart_counter) do_hard_reboot = FALSE if(do_hard_reboot) - log_world("World hard rebooted at [time_stamp()]") + log_world("World hard rebooted at [TIME_STAMP("hh:mm:ss", FALSE)]") shutdown_logging() // See comment below. TgsEndProcess() - log_world("World rebooted at [time_stamp()]") + log_world("World rebooted at [TIME_STAMP("hh:mm:ss", FALSE)]") shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss. ..() diff --git a/code/modules/NTNet/network.dm b/code/modules/NTNet/network.dm index ae8948dafb..645f05ac90 100644 --- a/code/modules/NTNet/network.dm +++ b/code/modules/NTNet/network.dm @@ -133,14 +133,14 @@ return FALSE /datum/ntnet/proc/log_data_transfer(datum/netdata/data) - logs += "[station_time_timestamp()] - [data.generate_netlog()]" + logs += "[STATION_TIME_TIMESTAMP("hh:mm:ss")] - [data.generate_netlog()]" if(logs.len > setting_maxlogcount) logs = logs.Copy(logs.len - setting_maxlogcount, 0) return // Simplified logging: Adds a log. log_string is mandatory parameter, source is optional. /datum/ntnet/proc/add_log(log_string, obj/item/computer_hardware/network_card/source = null) - var/log_text = "[station_time_timestamp()] - " + var/log_text = "[STATION_TIME_TIMESTAMP("hh:mm:ss")] - " if(source) log_text += "[source.get_network_tag()] - " else diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index ebbef58cbb..8e1926115f 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -2,7 +2,7 @@ if(!message || !subject) return var/F = file("[GLOB.log_directory]/[subject].html") - WRITE_FILE(F, "[time_stamp()] [REF(src)] ([x],[y],[z]) || [src] [message]
    ") + WRITE_FILE(F, "[TIME_STAMP("hh:mm:ss", FALSE)] [REF(src)] ([x],[y],[z]) || [src] [message]
    ") /client/proc/investigate_show(subject in list("notes, memos, watchlist", INVESTIGATE_RESEARCH, INVESTIGATE_EXONET, INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_RADIATION, INVESTIGATE_CIRCUIT, INVESTIGATE_NANITES) ) set name = "Investigate" diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index c81c92bd0a..91fdc78d20 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -214,7 +214,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(heard_by_no_admins && usr && usr.ckey != initiator_ckey) heard_by_no_admins = FALSE send2irc(initiator_ckey, "Ticket #[id]: Answered by [key_name(usr)]") - _interactions += "[time_stamp()]: [formatted_message]" + _interactions += "[TIME_STAMP("hh:mm:ss", FALSE)]: [formatted_message]" //Removes the ahelp verb and returns it after 2 minutes /datum/admin_help/proc/TimeoutVerb() @@ -416,9 +416,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) dat += "
    [GLOB.TAB][TicketHref("Refresh", ref_src)][GLOB.TAB][TicketHref("Re-Title", ref_src, "retitle")]" if(state != AHELP_ACTIVE) dat += "[GLOB.TAB][TicketHref("Reopen", ref_src, "reopen")]" - dat += "

    Opened at: [gameTimestamp(wtime = opened_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)" + dat += "

    Opened at: [GAMETIMESTAMP("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)" if(closed_at) - dat += "
    Closed at: [gameTimestamp(wtime = closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)" + dat += "
    Closed at: [GAMETIMESTAMP("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)" dat += "

    " if(initiator) dat += "Actions: [FullMonty(ref_src)]
    " diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index 41438bcebd..c19eb50e7f 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -15,7 +15,7 @@ to_chat(user, "We begin our stasis, preparing energy to arise once more.") if(user.stat != DEAD) user.emote("deathgasp") - user.tod = station_time_timestamp() + user.tod = STATION_TIME_TIMESTAMP("hh:mm:ss") user.fakedeath("changeling") //play dead user.update_stat() user.update_canmove() diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm index aa1ee8adbc..04b4e3ed3c 100644 --- a/code/modules/assembly/doorcontrol.dm +++ b/code/modules/assembly/doorcontrol.dm @@ -55,7 +55,7 @@ if(specialfunctions & SHOCK) if(D.secondsElectrified) D.secondsElectrified = -1 - LAZYADD(D.shockedby, "\[[time_stamp()]\] [key_name(usr)]") + LAZYADD(D.shockedby, "\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(usr)]") log_combat(usr, D, "electrified") else D.secondsElectrified = 0 diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index ca746e74fd..fd7591db81 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -116,7 +116,7 @@ // We gathered everything. Create a fork and slowly display the results to the holder of the scanner. var/found_something = 0 - add_log("[station_time_timestamp()][get_timestamp()] - [target_name]", 0) + add_log("[STATION_TIME_TIMESTAMP("hh:mm:ss")][get_timestamp()] - [target_name]", 0) // Fingerprints if(length(fingerprints)) diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index 1c26a09c30..8b410130cb 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -76,7 +76,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) var/skipcount = abs(error_cooldown[erroruid]) - 1 error_cooldown[erroruid] = 0 if(skipcount > 0) - SEND_TEXT(world.log, "\[[time_stamp()]] Skipped [skipcount] runtimes in [E.file],[E.line].") + SEND_TEXT(world.log, "\[[TIME_STAMP("hh:mm:ss", FALSE)]] Skipped [skipcount] runtimes in [E.file],[E.line].") GLOB.error_cache.log_error(E, skip_count = skipcount) error_last_seen[erroruid] = world.time @@ -113,7 +113,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) if(GLOB.error_cache) GLOB.error_cache.log_error(E, desclines) - var/main_line = "\[[time_stamp()]] Runtime in [E.file],[E.line]: [E]" + var/main_line = "\[[TIME_STAMP("hh:mm:ss", FALSE)]] Runtime in [E.file],[E.line]: [E]" SEND_TEXT(world.log, main_line) for(var/line in desclines) SEND_TEXT(world.log, line) diff --git a/code/modules/error_handler/error_viewer.dm b/code/modules/error_handler/error_viewer.dm index adcbb8fb57..9ac65d26fb 100644 --- a/code/modules/error_handler/error_viewer.dm +++ b/code/modules/error_handler/error_viewer.dm @@ -131,10 +131,10 @@ GLOBAL_DATUM(error_cache, /datum/error_viewer/error_cache) /datum/error_viewer/error_source/New(exception/e) if (!istype(e)) - name = "\[[time_stamp()]] Uncaught exceptions" + name = "\[[TIME_STAMP("hh:mm:ss", FALSE)]] Uncaught exceptions" return - name = "\[[time_stamp()]] Runtime in [e.file], line [e.line]: [html_encode(e.name)]" + name = "\[[TIME_STAMP("hh:mm:ss", FALSE)]] Runtime in [e.file], line [e.line]: [html_encode(e.name)]" /datum/error_viewer/error_source/show_to(user, datum/error_viewer/back_to, linear) if (!istype(back_to)) @@ -156,15 +156,15 @@ GLOBAL_DATUM(error_cache, /datum/error_viewer/error_cache) /datum/error_viewer/error_entry/New(exception/e, list/desclines, skip_count) if (!istype(e)) - name = "\[[time_stamp()]] Uncaught exception: [html_encode(e.name)]" + name = "\[[TIME_STAMP("hh:mm:ss", FALSE)]] Uncaught exception: [html_encode(e.name)]" return if(skip_count) - name = "\[[time_stamp()]] Skipped [skip_count] runtimes in [e.file],[e.line]." + name = "\[[TIME_STAMP("hh:mm:ss", FALSE)]] Skipped [skip_count] runtimes in [e.file],[e.line]." is_skip_count = TRUE return - name = "\[[time_stamp()]] Runtime in [e.file], line [e.line]: [html_encode(e.name)]" + name = "\[[TIME_STAMP("hh:mm:ss", FALSE)]] Runtime in [e.file], line [e.line]: [html_encode(e.name)]" exc = e if (istype(desclines)) for (var/line in desclines) diff --git a/code/modules/integrated_electronics/subtypes/time.dm b/code/modules/integrated_electronics/subtypes/time.dm index 9f3265ed40..edb9e1ede3 100644 --- a/code/modules/integrated_electronics/subtypes/time.dm +++ b/code/modules/integrated_electronics/subtypes/time.dm @@ -175,7 +175,7 @@ desc = "Tells you what the time is, in terms and adjusted for your local station or planet" /obj/item/integrated_circuit/time/clock/station/get_time() - return station_time() + return STATION_TIME(FALSE) /obj/item/integrated_circuit/time/clock/bluespace name = "integrated clock (Bluespace Absolute Time)" diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index bd1da0a90f..8fdc50d2ac 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -197,7 +197,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) var/list/materials /datum/ore_silo_log/New(obj/machinery/M, _action, _amount, _noun, list/mats=list()) - timestamp = station_time_timestamp() + timestamp = STATION_TIME_TIMESTAMP("hh:mm:ss") machine_name = M.name area_name = get_area_name(M, TRUE) action = _action diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index fa66daf143..49d2722323 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -84,7 +84,7 @@ var/obj/item/clothing/suit/space/space_ninja/SN = wear_suit if(statpanel("SpiderOS")) stat("SpiderOS Status:","[SN.s_initialized ? "Initialized" : "Disabled"]") - stat("Current Time:", "[station_time_timestamp()]") + stat("Current Time:", "[STATION_TIME_TIMESTAMP("hh:mm:ss")]") if(SN.s_initialized) //Suit gear stat("Energy Charge:", "[round(SN.cell.charge/100)]%") @@ -438,7 +438,7 @@ return else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) return - var/crime = GLOB.data_core.createCrimeEntry(t1, t2, allowed_access, station_time_timestamp()) + var/crime = GLOB.data_core.createCrimeEntry(t1, t2, allowed_access, STATION_TIME_TIMESTAMP("hh:mm:ss")) GLOB.data_core.addMinorCrime(R.fields["id"], crime) investigate_log("New Minor Crime: [t1]: [t2] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) to_chat(usr, "Successfully added a minor crime.") @@ -454,7 +454,7 @@ return else if (!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) return - var/crime = GLOB.data_core.createCrimeEntry(t1, t2, allowed_access, station_time_timestamp()) + var/crime = GLOB.data_core.createCrimeEntry(t1, t2, allowed_access, STATION_TIME_TIMESTAMP("hh:mm:ss")) GLOB.data_core.addMajorCrime(R.fields["id"], crime) investigate_log("New Major Crime: [t1]: [t2] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) to_chat(usr, "Successfully added a major crime.") @@ -487,7 +487,7 @@ var/counter = 1 while(R.fields[text("com_[]", counter)]) counter++ - R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []
    []", allowed_access, station_time_timestamp(), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) + R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []
    []", allowed_access, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) to_chat(usr, "Successfully added comment.") return to_chat(usr, "Unable to locate a data core entry for this person.") diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 11e0c56d9e..f16572c5d0 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -53,7 +53,7 @@ stat = DEAD unset_machine() timeofdeath = world.time - tod = station_time_timestamp() + tod = STATION_TIME_TIMESTAMP("hh:mm:ss") var/turf/T = get_turf(src) for(var/obj/item/I in contents) I.on_mob_death(src, gibbed) diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 43abe7c825..d1c72069ac 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -284,5 +284,5 @@ emote("deathgasp") add_trait(TRAIT_FAKEDEATH, source) add_trait(TRAIT_DEATHCOMA, source) - tod = station_time_timestamp() + tod = STATION_TIME_TIMESTAMP("hh:mm:ss") update_stat() \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 30e58ebb44..9d662b1673 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -533,8 +533,8 @@ stat(null, "Next Map: [cached.map_name]") stat(null, "Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]") stat(null, "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]") - stat(null, "Round Time: [worldtime2text()]") - stat(null, "Station Time: [station_time_timestamp()]") + stat(null, "Round Time: [WORLDTIME2TEXT("hh:mm:ss")]") + stat(null, "Station Time: [STATION_TIME_TIMESTAMP("hh:mm:ss")]") stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)") if(SSshuttle.emergency) var/ETA = SSshuttle.emergency.getModeStr() diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index d041836f20..35b48afa28 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -474,7 +474,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp else colored_message = "[message]" - var/list/timestamped_message = list("[LAZYLEN(logging[smessage_type]) + 1]\[[time_stamp()]\] [key_name(src)] [loc_name(src)]" = colored_message) + var/list/timestamped_message = list("[LAZYLEN(logging[smessage_type]) + 1]\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(src)] [loc_name(src)]" = colored_message) logging[smessage_type] += timestamped_message diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm index 20ad05b8e3..7c4058ef39 100644 --- a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm +++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm @@ -19,12 +19,12 @@ return ..() /datum/ntnet_conversation/proc/add_message(message, username) - message = "[station_time_timestamp()] [username]: [message]" + message = "[STATION_TIME_TIMESTAMP("hh:mm:ss")] [username]: [message]" messages.Add(message) trim_message_list() /datum/ntnet_conversation/proc/add_status_message(message) - messages.Add("[station_time_timestamp()] -!- [message]") + messages.Add("[STATION_TIME_TIMESTAMP("hh:mm:ss")] -!- [message]") trim_message_list() /datum/ntnet_conversation/proc/trim_message_list() diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index bc5c711e60..580374c5c0 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -333,7 +333,7 @@ data["PC_programheaders"] = program_headers - data["PC_stationtime"] = station_time_timestamp() + data["PC_stationtime"] = STATION_TIME_TIMESTAMP("hh:mm:ss") data["PC_hasheader"] = 1 data["PC_showexitprogram"] = active_program ? 1 : 0 // Hides "Exit Program" button on mainscreen return data diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index def388c574..f8372dd2df 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -159,7 +159,7 @@
    [GLOB.data_core ? GLOB.data_core.get_manifest(0) : ""] "} - if(!printer.print_text(contents,text("crew manifest ([])", station_time_timestamp()))) + if(!printer.print_text(contents,text("crew manifest ([])", STATION_TIME_TIMESTAMP("hh:mm:ss")))) to_chat(usr, "Hardware error: Printer was unable to print the file. It may be out of paper.") return else diff --git a/code/modules/modular_computers/file_system/programs/file_browser.dm b/code/modules/modular_computers/file_system/programs/file_browser.dm index fb90ecbfad..090d64e9d7 100644 --- a/code/modules/modular_computers/file_system/programs/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/file_browser.dm @@ -145,7 +145,7 @@ t = replacetext(t, "\[/i\]", "") t = replacetext(t, "\[u\]", "") t = replacetext(t, "\[/u\]", "") - t = replacetext(t, "\[time\]", "[station_time_timestamp()]") + t = replacetext(t, "\[time\]", "[STATION_TIME_TIMESTAMP("hh:mm:ss")]") t = replacetext(t, "\[date\]", "[time2text(world.realtime, "MMM DD")] [GLOB.year_integer+540]") t = replacetext(t, "\[large\]", "") t = replacetext(t, "\[/large\]", "") From ee8df80c808abe16593e9618a2de6cb77e030ba2 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Tue, 2 Apr 2019 03:07:13 -0400 Subject: [PATCH 125/142] Ports tgstation/tgstation#40577 - Makes /datum/gas_mixture/share() roughly 5% faster by removing fairly useless abstraction, also contains a small boost to pipelines --- .../atmospherics/gasmixtures/gas_mixture.dm | 10 +- .../gasmixtures/immutable_mixtures.dm | 144 +++++++++--------- .../atmospherics/machinery/datum_pipeline.dm | 17 ++- 3 files changed, 84 insertions(+), 87 deletions(-) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index d07164ccd6..0304946111 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -29,6 +29,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) var/last_share = 0 var/list/reaction_results var/list/analyzer_results //used for analyzer feedback - not initialized until its used + var/gc_share = FALSE // Whether to call garbage_collect() on the sharer during shares, used for immutable mixtures /datum/gas_mixture/New(volume) gases = new @@ -143,9 +144,6 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) //Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length //Returns: amount of gas exchanged (+ if sharer received) -/datum/gas_mixture/proc/after_share(datum/gas_mixture/sharer) - //called on share's sharer to let it know it just got some gases - /datum/gas_mixture/proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient) //Performs temperature sharing calculations (via conduction) between two gas_mixtures assuming only 1 boundary length //Returns: new temperature of the sharer @@ -343,7 +341,8 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) if(length(cached_gases ^ sharer_gases)) //if all gases were present in both mixtures, we know that no gases are 0 garbage_collect(cached_gases - sharer_gases) //any gases the sharer had, we are guaranteed to have. gases that it didn't have we are not. sharer.garbage_collect(sharer_gases - cached_gases) //the reverse is equally true - sharer.after_share(src, atmos_adjacent_turfs) + if (initial(sharer.gc_share)) + sharer.garbage_collect() if(temperature_delta > MINIMUM_TEMPERATURE_TO_MOVE || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) var/our_moles TOTAL_MOLES(cached_gases,our_moles) @@ -351,9 +350,6 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) TOTAL_MOLES(sharer_gases,their_moles) return (temperature_archived*(our_moles + moved_moles) - sharer.temperature_archived*(their_moles - moved_moles)) * R_IDEAL_GAS_EQUATION / volume -/datum/gas_mixture/after_share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) - return - /datum/gas_mixture/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) //transfer of thermal energy (via conduction) between self and sharer if(sharer) diff --git a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm index 90b9550028..08f64b5f4a 100644 --- a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm +++ b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm @@ -1,73 +1,71 @@ -//"immutable" gas mixture used for immutable calculations -//it can be changed, but any changes will ultimately be undone before they can have any effect - -/datum/gas_mixture/immutable - var/initial_temperature - -/datum/gas_mixture/immutable/New() - ..() - garbage_collect() - -/datum/gas_mixture/immutable/garbage_collect() - temperature = initial_temperature - temperature_archived = initial_temperature - gases.Cut() - -/datum/gas_mixture/immutable/archive() - return 1 //nothing changes, so we do nothing and the archive is successful - -/datum/gas_mixture/immutable/merge() - return 0 //we're immutable. - -/datum/gas_mixture/immutable/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) - . = ..(sharer, 0) - garbage_collect() - -/datum/gas_mixture/immutable/after_share() - garbage_collect() - -/datum/gas_mixture/immutable/react() - return 0 //we're immutable. - -/datum/gas_mixture/immutable/copy() - return new type //we're immutable, so we can just return a new instance. - -/datum/gas_mixture/immutable/copy_from() - return 0 //we're immutable. - -/datum/gas_mixture/immutable/copy_from_turf() - return 0 //we're immutable. - -/datum/gas_mixture/immutable/parse_gas_string() - return 0 //we're immutable. - -/datum/gas_mixture/immutable/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) - . = ..() - temperature = initial_temperature - - -//used by space tiles -/datum/gas_mixture/immutable/space - initial_temperature = TCMB - -/datum/gas_mixture/immutable/space/heat_capacity() - return HEAT_CAPACITY_VACUUM - -/datum/gas_mixture/immutable/space/remove() - return copy() //we're always empty, so we can just return a copy. - -/datum/gas_mixture/immutable/space/remove_ratio() - return copy() //we're always empty, so we can just return a copy. - - -//used by cloners -/datum/gas_mixture/immutable/cloner - initial_temperature = T20C - -/datum/gas_mixture/immutable/cloner/garbage_collect() - ..() - ADD_GAS(/datum/gas/nitrogen, gases) - gases[/datum/gas/nitrogen][MOLES] = MOLES_O2STANDARD + MOLES_N2STANDARD - -/datum/gas_mixture/immutable/cloner/heat_capacity() - return (MOLES_O2STANDARD + MOLES_N2STANDARD)*20 //specific heat of nitrogen is 20 +//"immutable" gas mixture used for immutable calculations +//it can be changed, but any changes will ultimately be undone before they can have any effect + +/datum/gas_mixture/immutable + var/initial_temperature + gc_share = TRUE + +/datum/gas_mixture/immutable/New() + ..() + garbage_collect() + +/datum/gas_mixture/immutable/garbage_collect() + temperature = initial_temperature + temperature_archived = initial_temperature + gases.Cut() + +/datum/gas_mixture/immutable/archive() + return 1 //nothing changes, so we do nothing and the archive is successful + +/datum/gas_mixture/immutable/merge() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) + . = ..(sharer, 0) + garbage_collect() + +/datum/gas_mixture/immutable/react() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/copy() + return new type //we're immutable, so we can just return a new instance. + +/datum/gas_mixture/immutable/copy_from() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/copy_from_turf() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/parse_gas_string() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) + . = ..() + temperature = initial_temperature + + +//used by space tiles +/datum/gas_mixture/immutable/space + initial_temperature = TCMB + +/datum/gas_mixture/immutable/space/heat_capacity() + return HEAT_CAPACITY_VACUUM + +/datum/gas_mixture/immutable/space/remove() + return copy() //we're always empty, so we can just return a copy. + +/datum/gas_mixture/immutable/space/remove_ratio() + return copy() //we're always empty, so we can just return a copy. + + +//used by cloners +/datum/gas_mixture/immutable/cloner + initial_temperature = T20C + +/datum/gas_mixture/immutable/cloner/garbage_collect() + ..() + ADD_GAS(/datum/gas/nitrogen, gases) + gases[/datum/gas/nitrogen][MOLES] = MOLES_O2STANDARD + MOLES_N2STANDARD + +/datum/gas_mixture/immutable/cloner/heat_capacity() + return (MOLES_O2STANDARD + MOLES_N2STANDARD)*20 //specific heat of nitrogen is 20 diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index cfaef38f6c..c4fa387ab0 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -221,13 +221,16 @@ if(!P) continue GL += P.return_air() - for(var/obj/machinery/atmospherics/components/binary/valve/V in P.other_atmosmch) - if(V.on) - PL |= V.parents[1] - PL |= V.parents[2] - for(var/obj/machinery/atmospherics/components/unary/portables_connector/C in P.other_atmosmch) - if(C.connected_device) - GL += C.portableConnectorReturnAir() + for(var/atmosmch in P.other_atmosmch) + if (istype(atmosmch, /obj/machinery/atmospherics/components/binary/valve)) + var/obj/machinery/atmospherics/components/binary/valve/V = atmosmch + if(V.on) + PL |= V.parents[1] + PL |= V.parents[2] + else if (istype(atmosmch, /obj/machinery/atmospherics/components/unary/portables_connector)) + var/obj/machinery/atmospherics/components/unary/portables_connector/C = atmosmch + if(C.connected_device) + GL += C.portableConnectorReturnAir() var/total_thermal_energy = 0 var/total_heat_capacity = 0 From 98ce2cb4ef784cdaff654785a75374eb16cd6b7d Mon Sep 17 00:00:00 2001 From: Poojawa Date: Tue, 2 Apr 2019 02:57:59 -0500 Subject: [PATCH 126/142] Makes belly noises actually togglable --- .../code/modules/vore/eating/living_vr.dm | 2 ++ .../code/modules/vore/eating/vore_vr.dm | 5 +++++ .../code/modules/vore/eating/vorepanel_vr.dm | 16 +++++++++++++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/modular_citadel/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm index 469dcee276..7848f1f913 100644 --- a/modular_citadel/code/modules/vore/eating/living_vr.dm +++ b/modular_citadel/code/modules/vore/eating/living_vr.dm @@ -388,6 +388,7 @@ P.digestable = src.digestable P.devourable = src.devourable P.feeding = src.feeding + P.noisy = src.noisy P.vore_taste = src.vore_taste var/list/serialized = list() @@ -412,6 +413,7 @@ digestable = P.digestable devourable = P.devourable feeding = P.feeding + noisy = P.noisy vore_taste = P.vore_taste release_vore_contents(silent = TRUE) diff --git a/modular_citadel/code/modules/vore/eating/vore_vr.dm b/modular_citadel/code/modules/vore/eating/vore_vr.dm index 4cf223c3c4..64435619ae 100644 --- a/modular_citadel/code/modules/vore/eating/vore_vr.dm +++ b/modular_citadel/code/modules/vore/eating/vore_vr.dm @@ -41,6 +41,7 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums) var/devourable = FALSE var/feeding = FALSE // var/allowmobvore = TRUE + var/noisy = FALSE var/list/belly_prefs = list() var/vore_taste = "nothing in particular" // var/can_be_drop_prey = FALSE @@ -107,6 +108,7 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums) digestable = json_from_file["digestable"] devourable = json_from_file["devourable"] feeding = json_from_file["feeding"] + noisy = json_from_file["noisy"] vore_taste = json_from_file["vore_taste"] belly_prefs = json_from_file["belly_prefs"] @@ -117,6 +119,8 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums) devourable = FALSE if(isnull(feeding)) feeding = FALSE + if(isnull(noisy)) + noisy = FALSE if(isnull(belly_prefs)) belly_prefs = list() @@ -132,6 +136,7 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums) "digestable" = digestable, "devourable" = devourable, "feeding" = feeding, + "noisy" = noisy, "vore_taste" = vore_taste, "belly_prefs" = belly_prefs, ) diff --git a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm index c83ee788cb..4238ae4a7b 100644 --- a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm +++ b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm @@ -695,7 +695,7 @@ var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion") switch(choice) if("Cancel") - return + return 0 if("Allow Digestion") user.digestable = TRUE if("Prevent Digestion") @@ -708,7 +708,7 @@ var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [user.devourable ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment") switch(choice) if("Cancel") - return + return 0 if("Allow Devourment") user.devourable = TRUE if("Prevent Devourment") @@ -721,7 +721,7 @@ var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [user.feeding ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding") switch(choice) if("Cancel") - return + return 0 if("Allow Feeding") user.feeding = TRUE if("Prevent Feeding") @@ -730,5 +730,15 @@ if(user.client.prefs_vr) user.client.prefs_vr.feeding = user.feeding + if(href_list["togglenoisy"]) + var/choice = alert(user, "Toggle audible hunger noises. Currently: [user.noisy ? "Enabled" : "Disabled"]", "", "Enable audible hunger", "Cancel", "Disable audible hunger") + switch(choice) + if("Cancel") + return 0 + if("Enable audible hunger") + user.noisy = TRUE + if("Disable audible hunger") + user.noisy = FALSE + //Refresh when interacted with, returning 1 makes vore_look.Topic update return 1 \ No newline at end of file From 378433a5efbdf0fed3861d3c86a220b2495c4c74 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 Apr 2019 05:05:24 -0500 Subject: [PATCH 127/142] Automatic changelog generation for PR #8199 [ci skip] --- html/changelogs/AutoChangeLog-pr-8199.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8199.yml diff --git a/html/changelogs/AutoChangeLog-pr-8199.yml b/html/changelogs/AutoChangeLog-pr-8199.yml new file mode 100644 index 0000000000..d3bf5a07e5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8199.yml @@ -0,0 +1,4 @@ +author: "Poojawa" +delete-after: True +changes: + - bugfix: "Hunger noises are now toggled per character" From f5a5e4f4eee00fd0b505c6835019fa92c1caf208 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 Apr 2019 07:33:29 -0500 Subject: [PATCH 128/142] Automatic changelog generation for PR #8197 [ci skip] --- html/changelogs/AutoChangeLog-pr-8197.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8197.yml diff --git a/html/changelogs/AutoChangeLog-pr-8197.yml b/html/changelogs/AutoChangeLog-pr-8197.yml new file mode 100644 index 0000000000..cdd2b4e877 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8197.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - code_imp: "squeezed a little bit more perf out of atmos" From 280a84679f3e6ba1718872ecf19f45cb2ba0c6fc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 Apr 2019 07:34:31 -0500 Subject: [PATCH 129/142] Automatic changelog generation for PR #8183 [ci skip] --- html/changelogs/AutoChangeLog-pr-8183.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8183.yml diff --git a/html/changelogs/AutoChangeLog-pr-8183.yml b/html/changelogs/AutoChangeLog-pr-8183.yml new file mode 100644 index 0000000000..01b3cd4b2b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8183.yml @@ -0,0 +1,5 @@ +author: "bluespace bio bags" +delete-after: True +changes: + - rscadd: "Added bluespace bio bags and put it in the tech web, in the node applied bluespace" + - imageadd: "added a crappy icon for bluespace bio bags" From 99a8c562cdf8dd62587d07d0feaff8a408a966ed Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 Apr 2019 07:36:37 -0500 Subject: [PATCH 130/142] Automatic changelog generation for PR #8185 [ci skip] --- html/changelogs/AutoChangeLog-pr-8185.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8185.yml diff --git a/html/changelogs/AutoChangeLog-pr-8185.yml b/html/changelogs/AutoChangeLog-pr-8185.yml new file mode 100644 index 0000000000..eec6e7c3b2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8185.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - rscadd: "The storage hud now properly takes into account the viewer's view size, meaning storage items with a large amount of storage slots will properly stretch across the bottom of the screen when running in widescreen." From 5204d8a9e142ae123849350b378bf0481b7e88b5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 Apr 2019 07:39:08 -0500 Subject: [PATCH 131/142] Automatic changelog generation for PR #8192 [ci skip] --- html/changelogs/AutoChangeLog-pr-8192.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8192.yml diff --git a/html/changelogs/AutoChangeLog-pr-8192.yml b/html/changelogs/AutoChangeLog-pr-8192.yml new file mode 100644 index 0000000000..28d8f00814 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8192.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - code_imp: "The client update portion of /mob/Login() now double-checks to make sure client.player_details exists and is of the proper type. This should hopefully fix the \"cannot read null.player_details\" runtimes that can spontaneously cause clients to get kicked out and forced back to the lobby." From 1cfeb5febaf2a4f89529fa383cbf36faebd590ad Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 Apr 2019 07:39:36 -0500 Subject: [PATCH 132/142] Automatic changelog generation for PR #8184 [ci skip] --- html/changelogs/AutoChangeLog-pr-8184.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8184.yml diff --git a/html/changelogs/AutoChangeLog-pr-8184.yml b/html/changelogs/AutoChangeLog-pr-8184.yml new file mode 100644 index 0000000000..6a55b6468b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8184.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - code_imp: "Goonchat's JS no longer contains checks related to a completely unused message filtering function, which should improve clientside performance quite a bit" From c931da21eb0193ecbef0eb12bd914c0f6a584fe2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 Apr 2019 07:52:08 -0500 Subject: [PATCH 133/142] Automatic changelog generation for PR #8123 [ci skip] --- html/changelogs/AutoChangeLog-pr-8123.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8123.yml diff --git a/html/changelogs/AutoChangeLog-pr-8123.yml b/html/changelogs/AutoChangeLog-pr-8123.yml new file mode 100644 index 0000000000..56b2f82ad6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8123.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - tweak: "Sprinting no longer takes stam when you're being pulled or when you're in zero gravity. Other sources of involuntary movement are not affected." From 264733b5d4cdf3d7272de86dfba9de6053b6d0b9 Mon Sep 17 00:00:00 2001 From: Zandario Date: Tue, 2 Apr 2019 13:58:27 -0500 Subject: [PATCH 134/142] Removed Chem Drain Circuit - We don't have Chempiles --- .../subtypes/reagents.dm | 68 ------------------- 1 file changed, 68 deletions(-) diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index af71c8605f..0d8bf96afc 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -695,74 +695,6 @@ activate_pin(2) busy = FALSE - -// - Drain circuit - // -/obj/item/integrated_circuit/reagent/drain - name = "chemical drain circuit" - desc = "This circuit either eliminates reagents by creating a puddle or can suck up chemicals on tiles." - icon_state = "injector" - extended_desc = "Set mode to FALSE to eliminate reagents and TRUE to drain." - - volume = 20 - - complexity = 10 - inputs = list( - "mode" = IC_PINTYPE_BOOLEAN - ) - outputs = list( - "volume" = IC_PINTYPE_NUMBER, - "self reference" = IC_PINTYPE_SELFREF - ) - activators = list( - "drain" = IC_PINTYPE_PULSE_IN, - "on drained" = IC_PINTYPE_PULSE_OUT, - "on fail" = IC_PINTYPE_PULSE_OUT - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 15 - - -/obj/item/integrated_circuit/reagent/drain/Initialize() - .=..() - set_pin_data(IC_OUTPUT,2, src) - - -/obj/item/integrated_circuit/reagent/drain/do_work() - if(get_pin_data(IC_OUTPUT, 1, reagents.total_volume)) - if(!reagents || !reagents.total_volume) - push_data() - activate_pin(3) - return - // Put the reagents on the floortile the assembly is on - reagents.reaction(get_turf(src)) - reagents.clear_reagents() - push_data() - activate_pin(2) - return - - else - if(reagents) - if(reagents.total_volume >= volume) - push_data() - activate_pin(3) - return - // Favorably, drain it from a chemicals pile, else, try something different - var/obj/effect/decal/cleanable/drainedchems = locate(/obj/effect/decal/cleanable) in get_turf(src) - if(!drainedchems || !drainedchems.reagents || drainedchems.reagents.total_volume == 0) - push_data() - activate_pin(3) - return - drainedchems.reagents.trans_to(src, 30, 0.5) - if(drainedchems.reagents.total_volume == 0) - qdel(drainedchems) - push_data() - activate_pin(2) - - -/obj/item/integrated_circuit/reagent/drain/on_reagent_change(changetype) - push_vol() - - // - Beaker Connector - // /obj/item/integrated_circuit/input/beaker_connector category_text = "Reagent" From a1c8155ec8421c6be10b7e5eac976adeeea1030f Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Tue, 2 Apr 2019 15:42:18 -0400 Subject: [PATCH 135/142] Update chem_dispenser.dm --- .../reagents/chemistry/machinery/chem_dispenser.dm | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index ad6b7dee51..7339f850d8 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -62,13 +62,14 @@ ) var/list/upgrade_reagents3 = list( - "omnizine", - "glycerol" + "glycerol", + "mine_salve", + "toxin" ) var/list/emagged_reagents = list( "space_drugs", - "sulfonal", + "plasma", "frostoil", "carpotoxin", "histamine", @@ -139,7 +140,6 @@ add_overlay(beaker_overlay) - /obj/machinery/chem_dispenser/emag_act(mob/user) if(obj_flags & EMAGGED) to_chat(user, "[src] has no functional safeties to emag.") @@ -487,8 +487,7 @@ upgrade_reagents3 = null emagged_reagents = list( "thirteenloko", - "morphine", - "uranium", + "changelingsting", "whiskeycola", "mindbreaker", "tirizene" @@ -544,11 +543,11 @@ emagged_reagents = list( "ethanol", "iron", + "alexander", "clownstears", "minttoxin", "atomicbomb", "fernet", - "slimejelly", "aphro", "aphro+" ) From 6107b2d2bec55b154547dccc4ae556155e706545 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Tue, 2 Apr 2019 21:03:48 -0500 Subject: [PATCH 136/142] Update living_vr.dm --- modular_citadel/code/modules/vore/eating/living_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm index 7848f1f913..96ac435b59 100644 --- a/modular_citadel/code/modules/vore/eating/living_vr.dm +++ b/modular_citadel/code/modules/vore/eating/living_vr.dm @@ -9,7 +9,7 @@ var/vore_taste = null // What the character tastes like var/no_vore = FALSE // If the character/mob can vore. var/openpanel = 0 // Is the vore panel open? - var/noisy = TRUE // tummies are rumbly? + var/noisy = FALSE // tummies are rumbly? var/absorbed = FALSE //are we absorbed? var/next_preyloop From ec7265d783251c8ee816c8a979597728cb0e3f1b Mon Sep 17 00:00:00 2001 From: deathride58 Date: Wed, 3 Apr 2019 00:12:09 -0400 Subject: [PATCH 137/142] Attempts to fix the bug where voreprefs sometimes fail to load at all by making client login force voreprefs to load if vore has been initialized but voreprefs havent --- code/modules/mob/living/login.dm | 4 +++- modular_citadel/code/modules/vore/eating/living_vr.dm | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index 611d9dbc4c..046d25a4b2 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -22,4 +22,6 @@ to_chat(src, "You can ventcrawl! Use alt+click on vents to quickly travel about the station.") if(ranged_ability) - ranged_ability.add_ranged_ability(src, "You currently have [ranged_ability] active!") \ No newline at end of file + ranged_ability.add_ranged_ability(src, "You currently have [ranged_ability] active!") + if(vore_init && !vorepref_init) //Vore's been initialized, voreprefs haven't. If this triggers then that means that voreprefs failed to load due to the client being missing. + apply_vore_prefs() diff --git a/modular_citadel/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm index 7848f1f913..ee503c3c7e 100644 --- a/modular_citadel/code/modules/vore/eating/living_vr.dm +++ b/modular_citadel/code/modules/vore/eating/living_vr.dm @@ -12,6 +12,8 @@ var/noisy = TRUE // tummies are rumbly? var/absorbed = FALSE //are we absorbed? var/next_preyloop + var/vore_init = FALSE //Has this mob's vore been initialized yet? + var/vorepref_init = FALSE //Has this mob's voreprefs been initialized? // // Hook for generic creation of stuff on new creatures @@ -34,6 +36,7 @@ return 1 /mob/living/proc/init_vore() + vore_init = TRUE //Something else made organs, meanwhile. if(LAZYLEN(vore_organs)) return TRUE @@ -407,6 +410,7 @@ if(!client || !client.prefs_vr) to_chat(src,"You attempted to apply your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.") return 0 + vorepref_init = TRUE var/datum/vore_preferences/P = client.prefs_vr From d5a4b4f29716c75ab518090fcff75ebd96cd9dfd Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 Apr 2019 01:44:30 -0500 Subject: [PATCH 138/142] Automatic changelog generation for PR #8207 [ci skip] --- html/changelogs/AutoChangeLog-pr-8207.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8207.yml diff --git a/html/changelogs/AutoChangeLog-pr-8207.yml b/html/changelogs/AutoChangeLog-pr-8207.yml new file mode 100644 index 0000000000..22b31a834c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8207.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - bugfix: "If a living mob has vore initialized but doesnt have voreprefs initialized, then client login will force voreprefs to load." From 2b62ac5723322044e4e48c91a2091b77d37ad13a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 Apr 2019 01:46:05 -0500 Subject: [PATCH 139/142] Automatic changelog generation for PR #8196 [ci skip] --- html/changelogs/AutoChangeLog-pr-8196.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8196.yml diff --git a/html/changelogs/AutoChangeLog-pr-8196.yml b/html/changelogs/AutoChangeLog-pr-8196.yml new file mode 100644 index 0000000000..631ccb6728 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8196.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - code_imp: "In an attempt to improve the performance of /mob/Stat(), various time-related procs now use defines instead of being procs that call procs that call other procs that call even more procs." From 5484005bbadf7f971f55099b2fb14c468a5540c0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 Apr 2019 02:00:17 -0500 Subject: [PATCH 140/142] Automatic changelog generation for PR #8172 [ci skip] --- html/changelogs/AutoChangeLog-pr-8172.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8172.yml diff --git a/html/changelogs/AutoChangeLog-pr-8172.yml b/html/changelogs/AutoChangeLog-pr-8172.yml new file mode 100644 index 0000000000..87c4b5baf7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8172.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - tweak: "The succumb verb is now available in the IC tab" From dc68683c6d24859187d75c4def067d0e5f0dc363 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 Apr 2019 02:01:50 -0500 Subject: [PATCH 141/142] Automatic changelog generation for PR #8194 [ci skip] --- html/changelogs/AutoChangeLog-pr-8194.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8194.yml diff --git a/html/changelogs/AutoChangeLog-pr-8194.yml b/html/changelogs/AutoChangeLog-pr-8194.yml new file mode 100644 index 0000000000..d7a8b0b540 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8194.yml @@ -0,0 +1,9 @@ +author: "Hippie Circuit Port" +delete-after: True +changes: + - rscadd: "Added all Atmospheric Circuits" + - rscadd: "Added the ability to color data disks" + - rscadd: "Added Selection and Storage Examiner Circuits" + - rscadd: "Added Smoke, Extinguisher, and Beaker Connector Circuits" + - rscadd: "Added Inserter, Renamer, Redescriber, and Repaint Circuits" + - rscadd: "Added MMI Tank and pAI Connector Circuits (The possibilities are endless!)" From 67e26a8ad333c0d7295755e0f7265b2084b67a27 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 Apr 2019 02:11:51 -0500 Subject: [PATCH 142/142] Automatic changelog generation for PR #8175 [ci skip] --- html/changelogs/AutoChangeLog-pr-8175.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8175.yml diff --git a/html/changelogs/AutoChangeLog-pr-8175.yml b/html/changelogs/AutoChangeLog-pr-8175.yml new file mode 100644 index 0000000000..00e8ea4ee3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8175.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - tweak: "Lighting now uses a linear algorithm to calculate falloff instead of an inverse-square algorithm."