diff --git a/code/game/gamemodes/modes_gameplays/cult/structures/tech_table.dm b/code/game/gamemodes/modes_gameplays/cult/structures/tech_table.dm
index 2e0ea3889268..286b1f702a1e 100644
--- a/code/game/gamemodes/modes_gameplays/cult/structures/tech_table.dm
+++ b/code/game/gamemodes/modes_gameplays/cult/structures/tech_table.dm
@@ -1,3 +1,6 @@
+#define ASPECT_CATEGORY "Аспекты"
+#define UNIQ_CATEGORY "Уникальные технологии"
+
/obj/structure/cult/tech_table
name = "scientific altar"
desc = "A bloodstained altar dedicated to Nar-Sie."
@@ -6,12 +9,11 @@
light_power = 2
light_range = 3
- // /datum/aspect = image
- // Maybe be wrapped too in /datum/building_agent
- var/static/list/aspect_images = list()
- // /datum/building_agent = image
- var/static/list/uniq_images = list()
- // string = image
+ // string = image()
+ var/static/list/tech_images = list()
+ // string = /datum/religion_tech
+ var/static/list/tech_by_id = list()
+ // string = image()
var/static/list/category_images = list()
var/researching = FALSE
@@ -19,7 +21,7 @@
var/end_research_time
var/current_research = "Ничего"
- var/datum/building_agent/tech/choosed_tech
+ var/datum/religion_tech/chosen_tech
var/tech_timer
var/list/pylon_around
@@ -30,9 +32,9 @@
pylon_around = null
if(tech_timer)
deltimer(tech_timer)
- if(choosed_tech)
- choosed_tech.researching = FALSE
- choosed_tech = null
+ if(chosen_tech)
+ chosen_tech.researching = FALSE
+ chosen_tech = null
return ..()
/obj/structure/cult/tech_table/examine(mob/user, distance)
@@ -70,106 +72,78 @@
to_chat(user, "По решению Возвышенного последователям запрещено самим исследовать!")
return
- if(!aspect_images.len)
- gen_aspect_images()
- if(uniq_images.len < religion.available_techs.len)
+ if(tech_images.len < religion.available_techs.len)
gen_tech_images(user)
if(!category_images.len)
gen_category_images()
var/choice = show_radial_menu(user, src, category_images, tooltips = TRUE, require_near = TRUE)
- switch(choice)
- if("Аспекты")
- choose_aspect(user)
- if("Уникальные технологии")
- choose_uniq_tech(user)
-
-/obj/structure/cult/tech_table/proc/choose_uniq_tech(mob/user)
- for(var/datum/building_agent/B in uniq_images)
- B.name = "[initial(B.name)] [B.get_costs()]"
-
- choosed_tech = show_radial_menu(user, src, uniq_images, tooltips = TRUE, require_near = TRUE)
- if(!choosed_tech || choosed_tech.researching)
+ var/list/tech = list()
+ var/list/user_tech_images = list()
+ for(var/tech_id in tech_by_id)
+ var/datum/religion_tech/RT = tech_by_id[tech_id]
+ if(istype(RT, /datum/religion_tech/upgrade_aspect))
+ var/datum/religion_tech/upgrade_aspect/aspect = RT
+ aspect.calculate_costs(religion)
+
+ var/tech_with_cost = "[RT.info.name] [RT.info.get_costs()]"
+ if(choice == ASPECT_CATEGORY && istype(RT, /datum/religion_tech/upgrade_aspect))
+ tech[tech_with_cost] = tech_id
+ user_tech_images[tech_with_cost] = tech_images[tech_id]
+ else if(choice == UNIQ_CATEGORY && istype(RT, /datum/religion_tech/cult))
+ tech[tech_with_cost] = tech_id
+ user_tech_images[tech_with_cost] = tech_images[tech_id]
+ choose_tech(user, tech, user_tech_images)
+
+// list/techs is (tech_name_with_cost = tech_id)
+// list/user_techs_images is (tech_name_with_cost = tech_images)
+/obj/structure/cult/tech_table/proc/choose_tech(mob/user, list/techs, list/user_techs_images)
+ var/tech_name_with_cost = show_radial_menu(user, src, user_techs_images, tooltips = TRUE, require_near = TRUE)
+ chosen_tech = tech_by_id[techs[tech_name_with_cost]]
+ if(!chosen_tech)
return
- if(!religion.check_costs(choosed_tech.favor_cost, choosed_tech.piety_cost, user))
+ if(chosen_tech.researching)
+ to_chat(user, "Уже изучается.")
+ return
+ if(!religion.check_costs(chosen_tech.info.favor_cost, chosen_tech.info.piety_cost, user))
return
- religion.adjust_favor(-choosed_tech.favor_cost)
- religion.adjust_piety(-choosed_tech.piety_cost)
-
- to_chat(user, "Вы начали изучение [initial(choosed_tech.name)].")
-
- current_research = initial(choosed_tech.name)
- choosed_tech.researching = TRUE
- start_activity(CALLBACK(src, PROC_REF(research_tech), choosed_tech))
-
-/obj/structure/cult/tech_table/proc/research_tech(datum/building_agent/tech/choosed_tech)
- religion.add_tech(choosed_tech.building_type)
-
- uniq_images -= choosed_tech
- religion.available_techs -= choosed_tech
- qdel(uniq_images[choosed_tech])
-
- end_activity()
-
-/obj/structure/cult/tech_table/proc/choose_aspect(mob/user)
- // Generates a name with the power of an aspect and upgrade cost
- for(var/datum/aspect/A in aspect_images)
- var/datum/aspect/in_religion = religion.aspects[initial(A.name)]
- A.name = "[initial(A.name)], сила: [in_religion ? in_religion.power : "0"], piety: [get_upgrade_cost(in_religion)]"
+ religion.adjust_favor(-chosen_tech.info.favor_cost)
+ religion.adjust_piety(-chosen_tech.info.piety_cost)
- var/datum/aspect/choosed_aspect = show_radial_menu(user, src, aspect_images, tooltips = TRUE, require_near = TRUE)
- if(!choosed_aspect)
- return
- var/datum/aspect/in_religion = religion.aspects[initial(choosed_aspect.name)]
- if(!religion.check_costs(null, get_upgrade_cost(in_religion), user))
- return
+ to_chat(user, "Вы начали изучение [chosen_tech.info.name].")
- religion.adjust_piety(-get_upgrade_cost(in_religion))
+ current_research = initial(chosen_tech.info.name)
+ chosen_tech.researching = TRUE
+ start_activity(CALLBACK(src, PROC_REF(research_tech), chosen_tech))
- to_chat(user, "Вы начали [in_religion ? "улучшение" : "изучение"] [initial(choosed_aspect.name)].")
- current_research = "[in_religion ? "улучшение" : "изучение"] [initial(choosed_aspect.name)]"
- start_activity(CALLBACK(src, PROC_REF(upgrade_aspect), choosed_aspect))
+/obj/structure/cult/tech_table/proc/research_tech(datum/religion_tech/researched)
+ religion.add_tech(researched)
-/obj/structure/cult/tech_table/proc/upgrade_aspect(datum/aspect/aspect_to_upgrade)
- if(initial(aspect_to_upgrade.name) in religion)
- var/datum/aspect/A = religion.aspects[initial(aspect_to_upgrade.name)]
- A.power += 1
- else
- religion.add_aspects(list(aspect_to_upgrade.type = 1))
+ tech_by_id -= researched.id
+ religion.available_techs -= researched
+ qdel(tech_images[researched.id])
+ tech_images -= researched.id
end_activity()
-/obj/structure/cult/tech_table/proc/get_upgrade_cost(datum/aspect/in_religion)
- if(!in_religion)
- var/all_aspects = 0
- for(var/aspect_name in cult_religion.aspects)
- all_aspects++
- var/cost = max(100, 50 + 25 * all_aspects) //We don't count 6 initial aspects and scale for static 150, +50 piety for each new aspect
- return cost
- return in_religion.power * 50
-
/obj/structure/cult/tech_table/proc/gen_category_images()
- category_images = list(
- "Аспекты" = aspect_images[pick(aspect_images)],
- "Уникальные технологии" = uniq_images[pick(uniq_images)],
- )
+ for(var/name in tech_images)
+ var/is_aspect_tech = istype(tech_by_id[name], /datum/religion_tech/upgrade_aspect)
+ if(!category_images[ASPECT_CATEGORY] && is_aspect_tech)
+ category_images[ASPECT_CATEGORY] = tech_images[name]
+ else if(!category_images[UNIQ_CATEGORY] && !is_aspect_tech)
+ category_images[UNIQ_CATEGORY] = tech_images[name]
+ if(category_images[UNIQ_CATEGORY] && category_images[ASPECT_CATEGORY])
+ break
/obj/structure/cult/tech_table/proc/gen_tech_images(mob/user)
- uniq_images = list()
- for(var/datum/building_agent/tech/BA in religion.available_techs)
- uniq_images[BA] = image(icon = BA.icon, icon_state = BA.icon_state)
-
-/obj/structure/cult/tech_table/proc/gen_aspect_images()
- var/list/aspects = subtypesof(/datum/aspect)
- aspect_images = list()
- for(var/type in aspects)
- var/datum/aspect/A = new type
- if(!A.name)
- qdel(A)
- continue
- aspect_images[A] = image(icon = A.icon, icon_state = A.icon_state)
+ tech_images = list()
+ tech_by_id = list()
+ for(var/datum/religion_tech/T in religion.available_techs)
+ tech_images[T.id] = image(icon = T.info.icon, icon_state = T.info.icon_state)
+ tech_by_id[T.id] = T
/obj/structure/cult/tech_table/proc/start_activity(datum/callback/end_activity)
LAZYINITLIST(pylon_around)
@@ -195,3 +169,6 @@
current_research = "Ничего"
can_unwrench = TRUE
+
+#undef ASPECT_CATEGORY
+#undef UNIQ_CATEGORY
diff --git a/code/modules/religion/building_agent.dm b/code/modules/religion/building_agent.dm
index 19e91aa3850a..a971f02fefbe 100644
--- a/code/modules/religion/building_agent.dm
+++ b/code/modules/religion/building_agent.dm
@@ -3,7 +3,7 @@
// Maybe rename
/datum/building_agent
var/name
- var/atom/building_type
+ var/datum/building_type
var/favor_cost = 0
var/deconstruct_favor_cost = 0
var/piety_cost = 0
@@ -139,9 +139,14 @@
/datum/building_agent/tech
var/icon
var/icon_state
- var/researching = FALSE
+
+/datum/building_agent/tech/aspect
+ // base costs
+ favor_cost = 0
+ piety_cost = 100
/datum/building_agent/tech/cult
+
/datum/building_agent/tech/cult/memorize_rune
name = "Запомнить Руну"
icon = 'icons/obj/rune.dmi'
diff --git a/code/modules/religion/religion.dm b/code/modules/religion/religion.dm
index e45ec0d85860..fdc2b19feeb6 100644
--- a/code/modules/religion/religion.dm
+++ b/code/modules/religion/religion.dm
@@ -131,7 +131,7 @@
// Type of initial runes agent for which available_runes will be generated
var/rune_agent_type
// All tech that religion can research
- var/list/datum/building_agent/available_techs = list()
+ var/list/datum/religion_tech/available_techs = list()
// Type of initial tech agent for which available_runes will be generated
var/tech_agent_type
@@ -611,6 +611,9 @@
/datum/religion/proc/gen_agent_lists()
init_subtypes(build_agent_type, available_buildings)
init_subtypes(rune_agent_type, available_runes)
+ get_tech_agent_lists()
+
+/datum/religion/proc/get_tech_agent_lists()
init_subtypes(tech_agent_type, available_techs)
/datum/religion/proc/on_holy_reagent_created(datum/reagent/R)
@@ -663,10 +666,9 @@
link = FOLLOW_LINK(M, source)
to_chat(M, "[link][format_name][message]")
-/datum/religion/proc/add_tech(tech_type)
- var/datum/religion_tech/T = new tech_type
- T.on_add(src)
- all_techs[T.id] = T
+/datum/religion/proc/add_tech(datum/religion_tech/tech)
+ tech.on_add(src)
+ all_techs[tech.id] = tech
/datum/religion/proc/get_tech(tech_id)
return all_techs[tech_id]
diff --git a/code/modules/religion/religion_types/cult.dm b/code/modules/religion/religion_types/cult.dm
index d665ebd15ffc..cfb1c916e983 100644
--- a/code/modules/religion/religion_types/cult.dm
+++ b/code/modules/religion/religion_types/cult.dm
@@ -35,7 +35,7 @@
area_type = /area/custom/cult
build_agent_type = /datum/building_agent/structure/cult
rune_agent_type = /datum/building_agent/rune/cult
- tech_agent_type = /datum/building_agent/tech/cult
+ tech_agent_type = /datum/religion_tech/cult
wall_types = list(/turf/simulated/wall/cult, /turf/simulated/wall/cult/runed, /turf/simulated/wall/cult/runed/anim)
floor_types = list(/turf/simulated/floor/engine/cult, /turf/simulated/floor/engine/cult/lava)
door_types = list(/obj/structure/mineral_door/cult)
@@ -113,6 +113,25 @@
/datum/religion/cult/setup_religions()
global.cult_religion = src
+/datum/religion/cult/get_tech_agent_lists()
+ ..()
+ var/list/aspect_types = subtypesof(/datum/aspect)
+ for(var/type in aspect_types)
+ var/datum/aspect/A = new type
+ if(!A.name)
+ qdel(A)
+ continue
+ var/datum/religion_tech/upgrade_aspect/tech = new
+ tech.id = A.name
+ tech.aspect_type = type
+ tech.info = new /datum/building_agent/tech/aspect
+ tech.info.name = A.name
+ tech.info.icon = A.icon
+ tech.info.icon_state = A.icon_state
+ tech.calculate_costs(src)
+ available_techs += tech
+ qdel(A)
+
/datum/religion/cult/process()
adjust_favor(passive_favor_gain)
if(next_anomaly < world.time)
diff --git a/code/modules/religion/tech.dm b/code/modules/religion/tech.dm
index 24e6d2449b8c..3e1b25fb4aee 100644
--- a/code/modules/religion/tech.dm
+++ b/code/modules/religion/tech.dm
@@ -1,6 +1,11 @@
-// A small /datum for applying some technology to religion
/datum/religion_tech
var/id
+ var/researching = FALSE
+ var/datum/building_agent/tech/info
+
+/datum/religion_tech/New()
+ if(info)
+ info = new info
/datum/religion_tech/proc/on_add(datum/religion/R)
return
@@ -8,6 +13,7 @@
/datum/religion_tech/cult
/datum/religion_tech/cult/memorizing_rune
id = RTECH_MEMORIZE_RUNE
+ info = /datum/building_agent/tech/cult/memorize_rune
/datum/religion_tech/cult/memorizing_rune/proc/give_spell(datum/religion/R, mob/M, holy_role)
var/obj/effect/proc_holder/spell/no_target/memorize_rune/MR = M.GetSpell(/obj/effect/proc_holder/spell/no_target/memorize_rune)
@@ -32,22 +38,54 @@
/datum/religion_tech/cult/reusable_runes
id = RTECH_REUSABLE_RUNE
+ info = /datum/building_agent/tech/cult/reusable_runes
/datum/religion_tech/cult/build_everywhere
id = RTECH_BUILD_EVERYWHERE
+ info = /datum/building_agent/tech/cult/build_everywhere
/datum/religion_tech/cult/more_runes
id = RTECH_MORE_RUNES
+ info = /datum/building_agent/tech/cult/more_runes
/datum/religion_tech/cult/more_runes/on_add(datum/religion/cult/R)
R.max_runes_on_mob += 5
/datum/religion_tech/cult/mirror_shield
id = RTECH_MIRROR_SHIELD
+ info = /datum/building_agent/tech/cult/mirror_shield
/datum/religion_tech/cult/improved_pylons
id = RTECH_IMPROVED_PYLONS
+ info = /datum/building_agent/tech/cult/improved_pylons
/datum/religion_tech/cult/improved_pylons/on_add(datum/religion/cult/R)
for(var/obj/structure/cult/pylon/P as anything in global.pylons)
P.init_healing()
+
+/datum/religion_tech/upgrade_aspect
+ var/datum/aspect/aspect_type
+
+/datum/religion_tech/upgrade_aspect/on_add(datum/religion/R)
+ if(aspect_type::name in R.aspects)
+ var/datum/aspect/A = R.aspects[aspect_type::name]
+ A.power += 1
+ else
+ R.add_aspects(list(aspect_type = 1))
+
+ var/datum/religion_tech/upgrade_aspect/tech = new
+ tech.id = id + "+"
+ tech.aspect_type = aspect_type
+ tech.info = new /datum/building_agent/tech/aspect
+ tech.info.name = info.name
+ tech.info.icon = info.icon
+ tech.info.icon_state = info.icon_state
+ tech.calculate_costs(R)
+ R.available_techs += tech
+
+/datum/religion_tech/upgrade_aspect/proc/calculate_costs(datum/religion/R)
+ if(aspect_type::name in R.aspects)
+ var/datum/aspect/A = R.aspects[aspect_type::name]
+ info.piety_cost = A.power * 50
+ else
+ info.piety_cost = max(100, 50 + 25 * R.aspects.len) //We don't count 6 initial aspects and scale for static 150, +50 piety for each new aspect