From 4faa1124b69297c32ba7d6e92f2869fb3f7f061c Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Fri, 10 Jun 2016 10:30:03 -0400 Subject: [PATCH 1/9] Makes clockwork component generation slightly less crazy --- .../gamemodes/clock_cult/__clock_defines.dm | 8 ++- code/game/gamemodes/clock_cult/clock_items.dm | 68 +++++++++---------- .../gamemodes/clock_cult/clock_scripture.dm | 30 ++++---- .../gamemodes/clock_cult/clock_structures.dm | 44 +++++++----- .../gamemodes/clock_cult/clock_unsorted.dm | 21 ++++++ code/game/turfs/simulated/walls_misc.dm | 8 ++- 6 files changed, 108 insertions(+), 71 deletions(-) diff --git a/code/game/gamemodes/clock_cult/__clock_defines.dm b/code/game/gamemodes/clock_cult/__clock_defines.dm index 5b24c15f731..fc2eb1b1b56 100644 --- a/code/game/gamemodes/clock_cult/__clock_defines.dm +++ b/code/game/gamemodes/clock_cult/__clock_defines.dm @@ -14,7 +14,13 @@ var/global/ratvar_awakens = FALSE //If Ratvar has been summoned #define SCRIPTURE_REVENANT 4 #define SCRIPTURE_JUDGEMENT 5 -#define SLAB_PRODUCTION_THRESHOLD 60 //How many cycles slabs require to produce a single component; defaults to one minute +#define SLAB_PRODUCTION_TIME 400 //how long(deciseconds) slabs require to produce a single component; defaults to 40 seconds + +#define CACHE_PRODUCTION_TIME 300 //how long(deciseconds) caches require to produce a component; defaults to 30 seconds + +#define LOWER_PROB_PER_COMPONENT 10 //how much each component in the cache reduces the weight of getting another of that component type + +#define MAX_COMPONENTS_BEFORE_RAND 10*LOWER_PROB_PER_COMPONENT //the number of each component, times LOWER_PROB_PER_COMPONENT, you need to have before component generation will become random #define GATEWAY_SUMMON_RATE 3 //The speed multiplier used by the Gateway to the Celestial Derelict; defaults to 3x speed diff --git a/code/game/gamemodes/clock_cult/clock_items.dm b/code/game/gamemodes/clock_cult/clock_items.dm index dce3ff01418..bf1d3b7fab7 100644 --- a/code/game/gamemodes/clock_cult/clock_items.dm +++ b/code/game/gamemodes/clock_cult/clock_items.dm @@ -28,7 +28,7 @@ w_class = 3 var/list/stored_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) var/busy //If the slab is currently being used by something - var/production_cycle = 0 + var/production_time = 0 var/no_cost = FALSE //If the slab is admin-only and needs no components and has no scripture locks /obj/item/clockwork/slab/starter @@ -45,16 +45,17 @@ /obj/item/clockwork/slab/New() ..() SSobj.processing += src + production_time = world.time + SLAB_PRODUCTION_TIME /obj/item/clockwork/slab/Destroy() SSobj.processing -= src - ..() + return ..() /obj/item/clockwork/slab/process() - production_cycle++ - if(production_cycle < SLAB_PRODUCTION_THRESHOLD) - return 0 - var/component_to_generate = pick("belligerent_eye", "vanguard_cogwheel", "guvax_capacitor", "replicant_alloy", "hierophant_ansible") //Possible todo: Generate based on the lowest amount? + if(production_time > world.time) + return + var/component_to_generate = get_weighted_component_id(src) //more likely to generate components that we have less of + production_time = world.time + SLAB_PRODUCTION_TIME stored_components[component_to_generate]++ var/mob/living/L if(isliving(loc)) @@ -64,17 +65,15 @@ if(isliving(W.loc)) //Only goes one level down - otherwise it just doesn't tell you L = W.loc if(L) - L << "Your slab clunks as it produces a new component." - production_cycle = 0 - return 1 + L << "Your slab clunks as it produces a new component." /obj/item/clockwork/slab/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/clockwork/component) && is_servant_of_ratvar(user)) var/obj/item/clockwork/component/C = I if(!C.component_id) return 0 - user.visible_message("[user] inserts [C] into [src]'s compartments.", "You insert [C] into [src].") - stored_components[C.component_id]++ + user.visible_message("[user] inserts [C] into [src].", "You insert [C] into [src], where it is added to the global cache.") + clockwork_component_cache[C.component_id]++ user.drop_item() qdel(C) return 1 @@ -93,7 +92,8 @@ return 0 if(!is_servant_of_ratvar(user)) user << "The information on [src]'s display shifts rapidly. After a moment, your head begins to pound, and you tear your eyes away." - user.confused = max(0, user.confused + 3) + user.confused += 5 + user.dizziness += 5 return 0 if(busy) user << "[src] refuses to work, displaying the message: \"[busy]!\"" @@ -103,7 +103,7 @@ /obj/item/clockwork/slab/proc/access_display(mob/living/user) if(!is_servant_of_ratvar(user)) return 0 - var/action = input(user, "Among the swathes of information, you see...", "[src]") as null|anything in list("Recital", "Records", "Recollection", "Repository", "Report") + var/action = input(user, "Among the swathes of information, you see...", "[src]") as null|anything in list("Recital", "Records", "Recollection", "Report") if(!action || !user.canUseTopic(src)) return 0 switch(action) @@ -113,9 +113,6 @@ show_stats(user) if("Recollection") show_guide(user) - if("Repository") - show_components(user) - access_display(user) if("Report") show_hierophant(user) access_display(user) @@ -329,14 +326,15 @@ popup.open() return 1 -/obj/item/clockwork/slab/proc/show_components(mob/living/user) - user << "Stored components:" - user << "Belligerent Eyes: [stored_components["belligerent_eye"]]" - user << "Vanguard Cogwheels: [stored_components["vanguard_cogwheel"]]" - user << "Guvax Capacitors: [stored_components["guvax_capacitor"]]" - user << "Replicant Alloys: [stored_components["replicant_alloy"]]" - user << "Hierophant Ansibles: [stored_components["hierophant_ansible"]]" - return 1 +/obj/item/clockwork/slab/examine(mob/user) + ..() + if(is_servant_of_ratvar(user) || isobserver(user)) + user << "Stored components (with global cache):" + user << "Belligerent Eyes: [stored_components["belligerent_eye"]] ([stored_components["belligerent_eye"] + clockwork_component_cache["belligerent_eye"]])" + user << "Vanguard Cogwheels: [stored_components["vanguard_cogwheel"]] ([stored_components["vanguard_cogwheel"] + clockwork_component_cache["vanguard_cogwheel"]])" + user << "Guvax Capacitors: [stored_components["guvax_capacitor"]] ([stored_components["guvax_capacitor"] + clockwork_component_cache["guvax_capacitor"]])" + user << "Replicant Alloys: [stored_components["replicant_alloy"]] ([stored_components["replicant_alloy"] + clockwork_component_cache["replicant_alloy"]])" + user << "Hierophant Ansibles: [stored_components["hierophant_ansible"]] ([stored_components["hierophant_ansible"] + clockwork_component_cache["hierophant_ansible"]])" /obj/item/clockwork/slab/proc/show_hierophant(mob/living/user) var/message = stripped_input(user, "Enter a message to send to your fellow servants.", "Hierophant") @@ -853,8 +851,8 @@ w_class = 3 var/specific_component //The type of component that the daemon is set to produce in particular, if any var/obj/structure/clockwork/cache/cache //The cache the daemon is feeding - var/production_progress = 0 //Progress towards production of the next component in seconds - var/production_interval = 30 //How many seconds it takes to produce a new component + var/production_time = 0 //Progress towards production of the next component in seconds + var/production_cooldown = 200 //How many deciseconds it takes to produce a new component /obj/item/clockwork/tinkerers_daemon/New() ..() @@ -864,7 +862,7 @@ /obj/item/clockwork/tinkerers_daemon/Destroy() SSobj.processing -= src clockwork_daemons-- - ..() + return ..() /obj/item/clockwork/tinkerers_daemon/process() if(!cache) @@ -872,19 +870,15 @@ new/obj/item/clockwork/daemon_shell(get_turf(src)) qdel(src) return 0 - var/servants = 0 + /*var/servants = 0 for(var/mob/living/L in living_mob_list) if(is_servant_of_ratvar(L)) servants++ - if(servants / 5 < clockwork_daemons) - return 0 - production_progress = min(production_progress + 1, production_interval) - if(production_progress >= production_interval) - production_progress = 0 //Start it over - if(specific_component) - clockwork_component_cache[specific_component]++ - else - clockwork_component_cache[pick("belligerent_eye", "vanguard_cogwheel", "guvax_capacitor", "replicant_alloy", "hierophant_ansible")]++ + if(servants * 0.2 < clockwork_daemons) + return 0 */ + if(production_time <= world.time) + production_time = world.time + production_cooldown //Start it over + generate_cache_component(specific_component) cache.visible_message("Something clunks around inside of [cache].") /obj/item/clockwork/tinkerers_daemon/attack_hand(mob/user) diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm index f50971dc89a..b4fe4fb7841 100644 --- a/code/game/gamemodes/clock_cult/clock_scripture.dm +++ b/code/game/gamemodes/clock_cult/clock_scripture.dm @@ -28,15 +28,19 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed /datum/clockwork_scripture/proc/run_scripture() if(can_recite() && check_special_requirements()) + if(slab.busy) + invoker << "[slab] refuses to work, displaying the message: \"[slab.busy]!\"" + return 0 slab.busy = "Invocation ([name]) in progress" - if(check_special_requirements() && recital()) - slab.busy = null - if(check_special_requirements() && scripture_effects() && (!ratvar_awakens || !slab.no_cost)) - for(var/i in required_components) - if(clockwork_component_cache[i] >= consumed_components[i]) //Draw components from the global cache first - clockwork_component_cache[i] -= consumed_components[i] - else - slab.stored_components[i] -= consumed_components[i] + if(!ratvar_awakens && !slab.no_cost) + for(var/i in consumed_components) + if(slab.stored_components[i] >= consumed_components[i]) //Draw components from the slab first + slab.stored_components[i] -= consumed_components[i] + else + clockwork_component_cache[i] -= consumed_components[i] + if(check_special_requirements()) + if(recital()) + scripture_effects() if(slab) slab.busy = null qdel(src) @@ -63,7 +67,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed return 0 return 1 -/datum/clockwork_scripture/proc/check_special_requirements() //Special requirements for scriptures, checked three times during invocation +/datum/clockwork_scripture/proc/check_special_requirements() //Special requirements for scriptures, checked twice during invocation return 1 /datum/clockwork_scripture/proc/recital() //The process of speaking the words @@ -911,7 +915,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed for(var/obj/item/clockwork/clockwork_proselytizer/P in all_clockwork_objects) //Proselytizers no longer require alloy P.uses_alloy = FALSE for(var/obj/item/clockwork/tinkerers_daemon/D in all_clockwork_objects) //Daemons produce components twice as quickly - D.production_interval /= 2 + D.production_time *= 0.5 for(var/obj/structure/clockwork/powered/M in all_clockwork_objects) //Powered clockwork structures no longer need power M.needs_power = FALSE spawn(600) @@ -919,11 +923,11 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed W.damage_per_tick = initial(W.damage_per_tick) W.sight_range = initial(W.sight_range) for(var/obj/item/clockwork/clockwork_proselytizer/P in all_clockwork_objects) - P.uses_alloy = TRUE + P.uses_alloy = initial(P.uses_alloy) for(var/obj/item/clockwork/tinkerers_daemon/D in all_clockwork_objects) - D.production_interval = initial(D.production_interval) + D.production_time = initial(D.production_time) for(var/obj/structure/clockwork/powered/M in all_clockwork_objects) - M.needs_power = TRUE + M.needs_power = initial(M.needs_power) return 1 diff --git a/code/game/gamemodes/clock_cult/clock_structures.dm b/code/game/gamemodes/clock_cult/clock_structures.dm index 6a638542aac..61cd0d4c02a 100644 --- a/code/game/gamemodes/clock_cult/clock_structures.dm +++ b/code/game/gamemodes/clock_cult/clock_structures.dm @@ -28,7 +28,7 @@ /obj/structure/clockwork/Destroy() clockwork_construction_value -= construction_value all_clockwork_objects -= src - ..() + return ..() /obj/structure/clockwork/proc/destroyed() if(!takes_damage) @@ -115,6 +115,7 @@ icon_state = "tinkerers_cache" construction_value = 10 break_message = "The cache's fire winks out before it falls in on itself!" + var/wall_generation_cooldown /obj/structure/clockwork/cache/New() ..() @@ -122,6 +123,9 @@ /obj/structure/clockwork/cache/Destroy() clockwork_caches-- + for(var/I in src) + var/atom/movable/A = I + A.forceMove(get_turf(src)) //drop any daemons we have return ..() /obj/structure/clockwork/cache/attackby(obj/item/I, mob/living/user, params) @@ -169,7 +173,7 @@ D.cache = src D.specific_component = component_type user.visible_message("[user] spins the cogwheel on [I] and puts it into [src].", \ - "You activate the daemon and put it into [src]. It will now produce a component every thirty seconds.") + "You activate the daemon and put it into [src]. It will now produce a component every twenty seconds.") user.drop_item() qdel(I) return 1 @@ -199,20 +203,25 @@ var/obj/item/clockwork/component/the_component switch(component_to_withdraw) if("Belligerent Eye") - the_component = new/obj/item/clockwork/component/belligerent_eye(get_turf(src)) - clockwork_component_cache["belligerent_eye"]-- + if(clockwork_component_cache["belligerent_eye"]) + the_component = new/obj/item/clockwork/component/belligerent_eye(get_turf(src)) + clockwork_component_cache["belligerent_eye"]-- if("Vanguard Cogwheel") - the_component = new/obj/item/clockwork/component/vanguard_cogwheel(get_turf(src)) - clockwork_component_cache["vanguard_cogwheel"]-- + if(clockwork_component_cache["vanguard_cogwheel"]) + the_component = new/obj/item/clockwork/component/vanguard_cogwheel(get_turf(src)) + clockwork_component_cache["vanguard_cogwheel"]-- if("Guvax Capacitor") - the_component = new/obj/item/clockwork/component/guvax_capacitor(get_turf(src)) - clockwork_component_cache["guvax_capacitor"]-- + if(clockwork_component_cache["guvax_capacitor"]) + the_component = new/obj/item/clockwork/component/guvax_capacitor(get_turf(src)) + clockwork_component_cache["guvax_capacitor"]-- if("Replicant Alloy") - the_component = new/obj/item/clockwork/component/replicant_alloy(get_turf(src)) - clockwork_component_cache["replicant_alloy"]-- + if(clockwork_component_cache["replicant_alloy"]) + the_component = new/obj/item/clockwork/component/replicant_alloy(get_turf(src)) + clockwork_component_cache["replicant_alloy"]-- if("Hierophant Ansible") - the_component = new/obj/item/clockwork/component/hierophant_ansible(get_turf(src)) - clockwork_component_cache["hierophant_ansible"]-- + if(clockwork_component_cache["hierophant_ansible"]) + the_component = new/obj/item/clockwork/component/hierophant_ansible(get_turf(src)) + clockwork_component_cache["hierophant_ansible"]-- if(the_component) user.visible_message("[user] withdraws [the_component] from [src].", "You withdraw [the_component] from [src].") user.put_in_hands(the_component) @@ -222,11 +231,12 @@ ..() if(is_servant_of_ratvar(user) || isobserver(user)) user << "Stored components:" - user << "Belligerent Eyes: [clockwork_component_cache["belligerent_eye"]]" - user << "Vanguard Cogwheels: [clockwork_component_cache["vanguard_cogwheel"]]" - user << "Guvax Capacitors: [clockwork_component_cache["guvax_capacitor"]]" - user << "Replicant Alloys: [clockwork_component_cache["replicant_alloy"]]" - user << "Hierophant Ansibles: [clockwork_component_cache["hierophant_ansible"]]" + user << "Belligerent Eyes: [clockwork_component_cache["belligerent_eye"]]" + user << "Vanguard Cogwheels: [clockwork_component_cache["vanguard_cogwheel"]]" + user << "Guvax Capacitors: [clockwork_component_cache["guvax_capacitor"]]" + user << "Replicant Alloys: [clockwork_component_cache["replicant_alloy"]]" + user << "Hierophant Ansibles: [clockwork_component_cache["hierophant_ansible"]]" + /obj/structure/clockwork/ocular_warden //Ocular warden: Low-damage, low-range turret. Deals constant damage to whoever it makes eye contact with. name = "ocular warden" diff --git a/code/game/gamemodes/clock_cult/clock_unsorted.dm b/code/game/gamemodes/clock_cult/clock_unsorted.dm index c5e8bc42091..6af772ede54 100644 --- a/code/game/gamemodes/clock_cult/clock_unsorted.dm +++ b/code/game/gamemodes/clock_cult/clock_unsorted.dm @@ -13,6 +13,27 @@ usr.verbs -= /mob/living/carbon/human/proc/function_call return 1 +/proc/generate_cache_component(specific_component_id) //generates a component in the global component cache, either random based on lowest or a specific component + if(specific_component_id) + clockwork_component_cache[specific_component_id]++ + else + var/component_to_generate = get_weighted_component_id() + clockwork_component_cache[component_to_generate]++ + +/proc/get_weighted_component_id(obj/item/clockwork/slab/storage_slab) //returns a chosen component id based on the lowest amount of that component + if(storage_slab) + return pickweight(list("belligerent_eye" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*(clockwork_component_cache["belligerent_eye"] + storage_slab.stored_components["belligerent_eye"]), 1), \ + "vanguard_cogwheel" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*(clockwork_component_cache["vanguard_cogwheel"] + storage_slab.stored_components["vanguard_cogwheel"]), 1), \ + "guvax_capacitor" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*(clockwork_component_cache["guvax_capacitor"] + storage_slab.stored_components["guvax_capacitor"]), 1), \ + "replicant_alloy" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*(clockwork_component_cache["replicant_alloy"] + storage_slab.stored_components["replicant_alloy"]), 1), \ + "hierophant_ansible" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*(clockwork_component_cache["hierophant_ansible"] + storage_slab.stored_components["hierophant_ansible"]), 1))) + + return pickweight(list("belligerent_eye" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*clockwork_component_cache["belligerent_eye"], 1), \ + "vanguard_cogwheel" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*clockwork_component_cache["vanguard_cogwheel"], 1), \ + "guvax_capacitor" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*clockwork_component_cache["guvax_capacitor"], 1), \ + "replicant_alloy" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*clockwork_component_cache["replicant_alloy"], 1), \ + "hierophant_ansible" = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*clockwork_component_cache["hierophant_ansible"], 1))) + //allows a mob to select a target to gate to /atom/movable/proc/procure_gateway(mob/living/invoker, time_duration, gateway_uses, two_way) var/list/possible_targets = list() diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm index 03c143adf24..4b400397296 100644 --- a/code/game/turfs/simulated/walls_misc.dm +++ b/code/game/turfs/simulated/walls_misc.dm @@ -64,10 +64,12 @@ /turf/closed/wall/clockwork/process() if(prob(2)) playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', rand(1, 5), 1, -4, 1, 1) - for(var/obj/structure/clockwork/cache/C in range(1, src)) - if(prob(5)) - clockwork_component_cache[pick("belligerent_eye", "vanguard_cogwheel", "guvax_capacitor", "replicant_alloy", "hierophant_ansible")]++ + for(var/obj/structure/clockwork/cache/C in orange(1, src)) + if(C.wall_generation_cooldown <= world.time) + C.wall_generation_cooldown = world.time + CACHE_PRODUCTION_TIME + generate_cache_component() playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', rand(15, 20), 1, -3, 1, 1) + C.visible_message("Something clunks around inside of [C].") /turf/closed/wall/clockwork/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/weapon/weldingtool)) From f73ae66659aa98b7b131ca2e8c001a5b9e5ca2e9 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Fri, 10 Jun 2016 10:37:09 -0400 Subject: [PATCH 2/9] testing --- code/game/gamemodes/clock_cult/clock_items.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_items.dm b/code/game/gamemodes/clock_cult/clock_items.dm index bf1d3b7fab7..02274430c46 100644 --- a/code/game/gamemodes/clock_cult/clock_items.dm +++ b/code/game/gamemodes/clock_cult/clock_items.dm @@ -870,12 +870,12 @@ new/obj/item/clockwork/daemon_shell(get_turf(src)) qdel(src) return 0 - /*var/servants = 0 + var/servants = 0 for(var/mob/living/L in living_mob_list) if(is_servant_of_ratvar(L)) servants++ if(servants * 0.2 < clockwork_daemons) - return 0 */ + return 0 if(production_time <= world.time) production_time = world.time + production_cooldown //Start it over generate_cache_component(specific_component) From ed73ddcb070b9af134d314439f60790963142670 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Fri, 10 Jun 2016 10:47:38 -0400 Subject: [PATCH 3/9] defrogging --- icons/obj/clockwork_objects.dmi | Bin 90291 -> 90123 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi index 21b91a745507b930572036618399a495afaaf27a..b293f7bfac92c508b92e5b3c12a24f2eea8db463 100644 GIT binary patch delta 14988 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 delta 15157 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 S)mnpqo2Kexl`l#bLH`dnbpWye From eaf0e464a3ec6f33d6593e54cfd3090a53223a29 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Fri, 10 Jun 2016 10:49:17 -0400 Subject: [PATCH 4/9] use the right proc --- code/game/gamemodes/clock_cult/clock_structures.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_structures.dm b/code/game/gamemodes/clock_cult/clock_structures.dm index 61cd0d4c02a..c43c1f3a398 100644 --- a/code/game/gamemodes/clock_cult/clock_structures.dm +++ b/code/game/gamemodes/clock_cult/clock_structures.dm @@ -123,9 +123,13 @@ /obj/structure/clockwork/cache/Destroy() clockwork_caches-- - for(var/I in src) - var/atom/movable/A = I - A.forceMove(get_turf(src)) //drop any daemons we have + return ..() + +/obj/structure/clockwork/cache/destroyed() + if(takes_damage) + for(var/I in src) + var/atom/movable/A = I + A.forceMove(get_turf(src)) //drop any daemons we have return ..() /obj/structure/clockwork/cache/attackby(obj/item/I, mob/living/user, params) From 82e5b7fb992f26b4b1e14b5af1ca96508cb52e9f Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Fri, 10 Jun 2016 12:11:11 -0400 Subject: [PATCH 5/9] failed scripture refunds components --- code/game/gamemodes/clock_cult/clock_items.dm | 10 ++++++--- .../gamemodes/clock_cult/clock_scripture.dm | 22 +++++++++++++++---- .../gamemodes/clock_cult/clock_structures.dm | 10 +++++++++ code/game/turfs/simulated/walls_misc.dm | 6 ----- 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_items.dm b/code/game/gamemodes/clock_cult/clock_items.dm index 02274430c46..2b599c82210 100644 --- a/code/game/gamemodes/clock_cult/clock_items.dm +++ b/code/game/gamemodes/clock_cult/clock_items.dm @@ -54,17 +54,21 @@ /obj/item/clockwork/slab/process() if(production_time > world.time) return - var/component_to_generate = get_weighted_component_id(src) //more likely to generate components that we have less of production_time = world.time + SLAB_PRODUCTION_TIME - stored_components[component_to_generate]++ var/mob/living/L if(isliving(loc)) L = loc else if(istype(loc, /obj/item/weapon/storage)) var/obj/item/weapon/storage/W = loc - if(isliving(W.loc)) //Only goes one level down - otherwise it just doesn't tell you + if(isliving(W.loc)) //Only goes one level down - otherwise it won't produce components L = W.loc if(L) + var/component_to_generate = get_weighted_component_id(src) //more likely to generate components that we have less of + stored_components[component_to_generate]++ + for(var/obj/item/clockwork/slab/S in L.GetAllContents()) //prevent slab abuse today + if(L == src) + continue + S.production_time = world.time + SLAB_PRODUCTION_TIME L << "Your slab clunks as it produces a new component." /obj/item/clockwork/slab/attackby(obj/item/I, mob/user, params) diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm index b4fe4fb7841..7d06bc6adb3 100644 --- a/code/game/gamemodes/clock_cult/clock_scripture.dm +++ b/code/game/gamemodes/clock_cult/clock_scripture.dm @@ -26,6 +26,11 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed var/multiple_invokers_optional = FALSE //If scripture can have multiple invokers to bolster its effects var/tier = SCRIPTURE_PERIPHERAL //The scripture's tier +//components the scripture used from a slab + var/list/used_slab_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) +//components the scripture used from the global cache + var/list/used_cache_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) + /datum/clockwork_scripture/proc/run_scripture() if(can_recite() && check_special_requirements()) if(slab.busy) @@ -36,11 +41,20 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed for(var/i in consumed_components) if(slab.stored_components[i] >= consumed_components[i]) //Draw components from the slab first slab.stored_components[i] -= consumed_components[i] + used_slab_components[i]++ else clockwork_component_cache[i] -= consumed_components[i] - if(check_special_requirements()) - if(recital()) - scripture_effects() + used_cache_components[i]++ + if(!check_special_requirements() || !recital() || !check_special_requirements() || !scripture_effects()) //if we fail any of these, refund components used + for(var/i in used_slab_components) + if(used_slab_components[i]) + if(slab) + slab.stored_components[i] += consumed_components[i] + else //if we can't find a slab add to the global cache + clockwork_component_cache[i] += consumed_components[i] + for(var/i in used_cache_components) + if(used_cache_components[i]) + clockwork_component_cache[i] += consumed_components[i] if(slab) slab.busy = null qdel(src) @@ -67,7 +81,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed return 0 return 1 -/datum/clockwork_scripture/proc/check_special_requirements() //Special requirements for scriptures, checked twice during invocation +/datum/clockwork_scripture/proc/check_special_requirements() //Special requirements for scriptures, checked three times during invocation return 1 /datum/clockwork_scripture/proc/recital() //The process of speaking the words diff --git a/code/game/gamemodes/clock_cult/clock_structures.dm b/code/game/gamemodes/clock_cult/clock_structures.dm index c43c1f3a398..701add34058 100644 --- a/code/game/gamemodes/clock_cult/clock_structures.dm +++ b/code/game/gamemodes/clock_cult/clock_structures.dm @@ -119,10 +119,12 @@ /obj/structure/clockwork/cache/New() ..() + SSobj.processing += src clockwork_caches++ /obj/structure/clockwork/cache/Destroy() clockwork_caches-- + SSobj.processing -= src return ..() /obj/structure/clockwork/cache/destroyed() @@ -132,6 +134,14 @@ A.forceMove(get_turf(src)) //drop any daemons we have return ..() +/obj/structure/clockwork/cache/process() + for(var/turf/closed/wall/clockwork/C in orange(1, src)) + if(wall_generation_cooldown <= world.time) + wall_generation_cooldown = world.time + CACHE_PRODUCTION_TIME + generate_cache_component() + playsound(C, 'sound/magic/clockwork/fellowship_armory.ogg', rand(15, 20), 1, -3, 1, 1) + visible_message("Something clunks around inside of [src].") + /obj/structure/clockwork/cache/attackby(obj/item/I, mob/living/user, params) if(!is_servant_of_ratvar(user)) return ..() diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm index 4b400397296..3cb00eb9e3b 100644 --- a/code/game/turfs/simulated/walls_misc.dm +++ b/code/game/turfs/simulated/walls_misc.dm @@ -64,12 +64,6 @@ /turf/closed/wall/clockwork/process() if(prob(2)) playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', rand(1, 5), 1, -4, 1, 1) - for(var/obj/structure/clockwork/cache/C in orange(1, src)) - if(C.wall_generation_cooldown <= world.time) - C.wall_generation_cooldown = world.time + CACHE_PRODUCTION_TIME - generate_cache_component() - playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', rand(15, 20), 1, -3, 1, 1) - C.visible_message("Something clunks around inside of [C].") /turf/closed/wall/clockwork/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/weapon/weldingtool)) From 077745a6a69394534b613cd3614b257454900562 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Fri, 10 Jun 2016 12:15:38 -0400 Subject: [PATCH 6/9] description --- code/game/gamemodes/clock_cult/clock_items.dm | 1 + code/game/gamemodes/clock_cult/clock_scripture.dm | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/clock_cult/clock_items.dm b/code/game/gamemodes/clock_cult/clock_items.dm index 2b599c82210..01a783730c5 100644 --- a/code/game/gamemodes/clock_cult/clock_items.dm +++ b/code/game/gamemodes/clock_cult/clock_items.dm @@ -333,6 +333,7 @@ /obj/item/clockwork/slab/examine(mob/user) ..() if(is_servant_of_ratvar(user) || isobserver(user)) + user << "Clockwork slabs will only generate components if held by a human or if inside a storage item held by a human, and when generating a component will prevent all other slabs held from generating components." user << "Stored components (with global cache):" user << "Belligerent Eyes: [stored_components["belligerent_eye"]] ([stored_components["belligerent_eye"] + clockwork_component_cache["belligerent_eye"]])" user << "Vanguard Cogwheels: [stored_components["vanguard_cogwheel"]] ([stored_components["vanguard_cogwheel"] + clockwork_component_cache["vanguard_cogwheel"]])" diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm index 7d06bc6adb3..71895772f7c 100644 --- a/code/game/gamemodes/clock_cult/clock_scripture.dm +++ b/code/game/gamemodes/clock_cult/clock_scripture.dm @@ -355,7 +355,6 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed invocations = list("Z`rgny, orpbzr terngre!") channel_time = 0 required_components = list("replicant_alloy" = 1) - consumed_components = list("replicant_alloy" = 1) //People were spamming slabs to get infinite components. You chose this. whispered = TRUE usage_tip = "This is inefficient as a way to produce components, as it consumes them in the first place." tier = SCRIPTURE_DRIVER From e49849048e37c335096a9a2dda38fe672ef8bfca Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Sat, 11 Jun 2016 08:50:26 -0400 Subject: [PATCH 7/9] faster floors --- code/game/turfs/simulated/floor/misc_floor.dm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index 1338eff7435..c2a80cfc0dc 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -123,20 +123,28 @@ ..() PoolOrNew(/obj/effect/overlay/temp/ratvar/floor, src) PoolOrNew(/obj/effect/overlay/temp/ratvar/beam, src) - SSobj.processing += src clockwork_construction_value++ /turf/open/floor/clockwork/Destroy() SSobj.processing -= src clockwork_construction_value-- + return ..() + +/turf/open/floor/clockwork/Entered(atom/movable/AM) ..() + SSobj.processing |= src /turf/open/floor/clockwork/process() + if(!healservants()) + SSobj.processing -= src + +/turf/open/floor/clockwork/proc/healservants() for(var/mob/living/L in src) if(L.stat == DEAD || !is_servant_of_ratvar(L)) continue L.adjustBruteLoss(-1) L.adjustFireLoss(-1) + . = 1 /turf/open/floor/clockwork/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/weapon/crowbar)) From 3018b4bec1fab0c854de10b4b1c949bc6bdf6241 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Sat, 11 Jun 2016 09:13:31 -0400 Subject: [PATCH 8/9] restore --- code/game/gamemodes/clock_cult/clock_structures.dm | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/clock_cult/clock_structures.dm b/code/game/gamemodes/clock_cult/clock_structures.dm index 701add34058..65834757a67 100644 --- a/code/game/gamemodes/clock_cult/clock_structures.dm +++ b/code/game/gamemodes/clock_cult/clock_structures.dm @@ -40,6 +40,13 @@ qdel(src) return 1 +/obj/structure/clockwork/burn() + SSobj.burning -= src + if(takes_damage) + playsound(src, 'sound/items/Welder.ogg', 100, 1) + visible_message("[src] is warped by the heat!") + take_damage(rand(50, 100), BURN) + /obj/structure/clockwork/proc/take_damage(amount, damage_type) if(!amount || !damage_type || !damage_type in list(BRUTE, BURN)) return 0 @@ -263,6 +270,7 @@ layer = HIGH_OBJ_LAYER break_message = "The warden's eye gives a glare of utter hate before falling dark!" debris = list(/obj/item/clockwork/component/belligerent_eye/blind_eye) + burn_state = LAVA_PROOF var/damage_per_tick = 3 var/sight_range = 3 var/mob/living/target @@ -328,6 +336,7 @@ anchored = 0 density = 0 takes_damage = FALSE + burn_state = LAVA_PROOF /obj/structure/clockwork/anima_fragment/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/device/mmi/posibrain/soul_vessel)) @@ -383,6 +392,7 @@ anchored = 1 density = 0 opacity = 0 + burn_state = LAVA_PROOF /obj/effect/clockwork/New() ..() @@ -393,7 +403,7 @@ return ..() /obj/effect/clockwork/examine(mob/user) - if(is_servant_of_ratvar(user) && clockwork_desc) + if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc) desc = clockwork_desc ..() desc = initial(desc) @@ -606,6 +616,8 @@ icon_state = "sigil" layer = LOW_OBJ_LAYER alpha = 50 + burn_state = FIRE_PROOF + burntime = 1 var/affects_servants = FALSE var/affects_stat = FALSE From 88c96aa5e84c2b53ab6f3428934c0117e2682a7c Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Sat, 11 Jun 2016 10:25:36 -0400 Subject: [PATCH 9/9] brief delay --- code/game/gamemodes/clock_cult/clock_items.dm | 2 +- code/game/gamemodes/clock_cult/clock_structures.dm | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_items.dm b/code/game/gamemodes/clock_cult/clock_items.dm index c97987c9c45..9bdc7086aad 100644 --- a/code/game/gamemodes/clock_cult/clock_items.dm +++ b/code/game/gamemodes/clock_cult/clock_items.dm @@ -707,7 +707,7 @@ if(production_time <= world.time) production_time = world.time + production_cooldown //Start it over generate_cache_component(specific_component) - cache.visible_message("Something clunks around inside of [cache].") + cache.visible_message("[cache] hums as the tinkerer's daemon within it produces a component.") /obj/item/clockwork/tinkerers_daemon/attack_hand(mob/user) return 0 diff --git a/code/game/gamemodes/clock_cult/clock_structures.dm b/code/game/gamemodes/clock_cult/clock_structures.dm index 65834757a67..d2da171b022 100644 --- a/code/game/gamemodes/clock_cult/clock_structures.dm +++ b/code/game/gamemodes/clock_cult/clock_structures.dm @@ -123,6 +123,7 @@ construction_value = 10 break_message = "The cache's fire winks out before it falls in on itself!" var/wall_generation_cooldown + var/wall_found = FALSE //if we've found a wall and finished our windup delay /obj/structure/clockwork/cache/New() ..() @@ -143,11 +144,17 @@ /obj/structure/clockwork/cache/process() for(var/turf/closed/wall/clockwork/C in orange(1, src)) + if(!wall_found) + wall_found = TRUE + wall_generation_cooldown = world.time + CACHE_PRODUCTION_TIME + visible_message("[src] starts to whirr in the presence of [C]...") + break if(wall_generation_cooldown <= world.time) wall_generation_cooldown = world.time + CACHE_PRODUCTION_TIME generate_cache_component() playsound(C, 'sound/magic/clockwork/fellowship_armory.ogg', rand(15, 20), 1, -3, 1, 1) - visible_message("Something clunks around inside of [src].") + visible_message("Something clunks around inside of [src]...") + break /obj/structure/clockwork/cache/attackby(obj/item/I, mob/living/user, params) if(!is_servant_of_ratvar(user))