From 4b2deebec629e7f272a06d7beaac79b9dbfa59bb Mon Sep 17 00:00:00 2001 From: Razharas Date: Wed, 30 Apr 2014 15:38:01 +0400 Subject: [PATCH] Making datum handling not suck balls too hard Yeah now it can roughly be called okish --- code/datums/crafting.dm | 113 +++++++++++++------ code/game/objects/structures/tables_racks.dm | 4 +- 2 files changed, 82 insertions(+), 35 deletions(-) diff --git a/code/datums/crafting.dm b/code/datums/crafting.dm index 021ab291a50..78b400e5c73 100644 --- a/code/datums/crafting.dm +++ b/code/datums/crafting.dm @@ -11,8 +11,11 @@ var/global/datum/crafting_controller/crafting_master var/can_be_deconstructed = 0 /datum/crafting_recipe/New() - spawn(10) - crafting_master.all_crafting_recipes |= src + crafting_master.all_crafting_recipes[name] = src + +/datum/crafting_recipe/table/New() + ..() + crafting_master.add_recipe_to_family("table", src) ////////////////////////////////////// // // @@ -20,7 +23,7 @@ var/global/datum/crafting_controller/crafting_master // // ////////////////////////////////////// -/datum/crafting_recipe/IED +/datum/crafting_recipe/table/IED name = "IED" result_path = /obj/item/weapon/grenade/iedcasing reqs = list(/obj/item/weapon/handcuffs/cable = 1, @@ -30,7 +33,7 @@ var/global/datum/crafting_controller/crafting_master /datum/reagent/fuel = 10) time = 80 -/datum/crafting_recipe/stunprod +/datum/crafting_recipe/table/stunprod name = "Stunprod" result_path = /obj/item/weapon/melee/baton/cattleprod reqs = list(/obj/item/weapon/handcuffs/cable = 1, @@ -40,7 +43,7 @@ var/global/datum/crafting_controller/crafting_master time = 80 parts = list(/obj/item/weapon/cell = 1) -/datum/crafting_recipe/ed209 +/datum/crafting_recipe/table/ed209 name = "ED209" result_path = /obj/machinery/bot/ed209 reqs = list(/obj/item/robot_parts/robot_suit = 1, @@ -57,7 +60,7 @@ var/global/datum/crafting_controller/crafting_master tools = list(/obj/item/weapon/weldingtool, /obj/item/weapon/screwdriver) time = 120 -/datum/crafting_recipe/secbot +/datum/crafting_recipe/table/secbot name = "Secbot" result_path = /obj/machinery/bot/secbot reqs = list(/obj/item/device/assembly/signaler = 1, @@ -68,7 +71,7 @@ var/global/datum/crafting_controller/crafting_master tools = list(/obj/item/weapon/weldingtool) time = 120 -/datum/crafting_recipe/cleanbot +/datum/crafting_recipe/table/cleanbot name = "Cleanbot" result_path = /obj/machinery/bot/cleanbot reqs = list(/obj/item/weapon/reagent_containers/glass/bucket = 1, @@ -76,7 +79,7 @@ var/global/datum/crafting_controller/crafting_master /obj/item/robot_parts/r_arm = 1) time = 80 -/datum/crafting_recipe/floorbot +/datum/crafting_recipe/table/floorbot name = "Floorbot" result_path = /obj/machinery/bot/floorbot reqs = list(/obj/item/weapon/storage/toolbox/mechanical = 1, @@ -85,7 +88,7 @@ var/global/datum/crafting_controller/crafting_master /obj/item/robot_parts/r_arm = 1) time = 80 -/datum/crafting_recipe/medbot +/datum/crafting_recipe/table/medbot name = "Medbot" result_path = /obj/machinery/bot/medbot reqs = list(/obj/item/device/healthanalyzer = 1, @@ -94,7 +97,7 @@ var/global/datum/crafting_controller/crafting_master /obj/item/robot_parts/r_arm = 1) time = 80 -/datum/crafting_recipe/flamethrower +/datum/crafting_recipe/table/flamethrower name = "Flamethrower" result_path = /obj/item/weapon/flamethrower reqs = list(/obj/item/weapon/weldingtool = 1, @@ -113,46 +116,91 @@ var/global/datum/crafting_controller/crafting_master var/list/all_crafting_recipes = list() /datum/crafting_controller/New() - init_subtypes(/datum/crafting_recipe, all_crafting_recipes) + crafting_master = src + add_family("table") + add_family("forge") + for(var/A in typesof(/datum/crafting_recipe)) + if(A == /datum/crafting_recipe) + continue + var/datum/crafting_recipe/CR = new A() + all_crafting_recipes[CR.name] = CR -/datum/crafting_controller/proc/add_family(name, list/members) - var/list/family = members - families.Add(name = family) +/datum/crafting_controller/proc/add_global_recipe(datum/crafting_recipe/CR) + all_crafting_recipes[CR.name] = CR -/datum/crafting_controller/proc/add_member(family_name, member) - var/list/family = families[family_name] - family.Add(member) +/datum/crafting_controller/proc/remove_global_recipe(datum/crafting_recipe/CR) + all_crafting_recipes[CR.name] = null + all_crafting_recipes.Remove(CR.name) -/datum/crafting_controller/proc/add_recipe_to_family(family_name, datum/recipe) - var/list/family = families[family_name] - for(var/datum/crafting_holder/A in family) - A.add_recipe(recipe) +/datum/crafting_controller/proc/add_family(name, list/members, list/recipes) + var/datum/crafting_family/family = new(name, members, recipes) + families[name] = family -/datum/crafting_controller/proc/remove_recipe_from_family(family_name, datum/recipe) - var/list/family = families[family_name] - for(var/datum/crafting_holder/A in family) - A.remove_recipe(recipe) +/datum/crafting_controller/proc/get_family_by_name(name) + return families[name] + +/datum/crafting_controller/proc/add_member_to_family(family_name, member) + var/datum/crafting_family/family = families[family_name] + family.add_member(member) + +/datum/crafting_controller/proc/add_recipe_to_family(family_name, datum/crafting_recipe/recipe) + var/datum/crafting_family/family = families[family_name] + family.add_recipe(recipe) + +/datum/crafting_controller/proc/remove_recipe_from_family(family_name, datum/crafting_recipe/recipe) + var/datum/crafting_family/family = families[family_name] + family.remove_recipe(recipe) /datum/crafting_controller/proc/remove_member(family_name, member) - var/list/family = families[family_name] - family.Remove(member) + var/datum/crafting_family/family = families[family_name] + family.remove_member(member) /datum/crafting_controller/proc/remove_family(family_name) - var/list/family = families[family_name] - families.Remove(family) - families.Remove(family_name) + var/datum/crafting_family/family = families[family_name] + del(family) + +/datum/crafting_family + var/name + var/list/recipes + var/list/members + +/datum/crafting_family/New(new_name, list/new_members = list(), list/new_recipes = list()) + name = new_name + recipes = new_recipes + members = new_members + +/datum/crafting_family/proc/add_member(datum/crafting_holder/member) + members |= member + member.family = src + +/datum/crafting_family/proc/remove_member(datum/crafting_holder/member) + members -= member + member.family = null + +/datum/crafting_family/proc/add_recipe(datum/crafting_recipe/recipe) + recipes[recipe.name] = recipe + +/datum/crafting_family/proc/remove_recipe(datum/crafting_recipe/recipe) + recipes[recipe.name] = null + recipes.Remove(recipe.name) + /datum/crafting_holder var/name var/atom/holder var/recipes var/busy + var/datum/crafting_family/family -/datum/crafting_holder/New(atom/location) +/datum/crafting_holder/New(atom/location, family_name) location.craft_holder = src holder = location spawn(10) crafting_master.all_crafting_points |= src + if(family_name) + family = crafting_master.get_family_by_name(family_name) + if(family) + recipes = family.recipes /datum/crafting_holder/proc/add_recipe(recipe) recipes |= recipe @@ -323,7 +371,8 @@ var/global/datum/crafting_controller/crafting_master if(busy) dat += "Construction inprogress..." else - for(var/datum/crafting_recipe/R in recipes) + for(var/A in recipes) + var/datum/crafting_recipe/R = recipes[A] if(check_contents(R, holder_contents)) dat += "[R.name]
" dat += "" diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 03f5b216c71..6defc064f1b 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -39,9 +39,7 @@ update_icon() update_adjacent() - craft_holder = new /datum/crafting_holder(src) - spawn(10) - craft_holder.recipes = crafting_master.all_crafting_recipes + craft_holder = new /datum/crafting_holder(src, "table") /obj/structure/table/Destroy() update_adjacent()