From 07e5957645023a612d6269ce279a3c97559f3cc5 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sun, 15 May 2016 20:03:29 -0700 Subject: [PATCH] TWEAK METADATA UNFINISHED --- code/game/jobs/job_controller.dm | 30 ++-- .../client/preference/loadout/gear_tweaks.dm | 144 ++++++++++++++++++ .../client/preference/loadout/loadout.dm | 6 +- .../preference/loadout/loadout_uniform.dm | 11 ++ code/modules/client/preference/preferences.dm | 33 ++++ code/modules/mob/mob.dm | 1 + paradise.dme | 2 +- 7 files changed, 212 insertions(+), 15 deletions(-) create mode 100644 code/modules/client/preference/loadout/gear_tweaks.dm diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 5147f6d061a..c4c56bab82e 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -398,7 +398,7 @@ var/global/datum/controller/occupations/job_master else permitted = 1 - if(G.whitelisted && !is_alien_whitelisted(H, G.whitelisted)) + if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted))) permitted = 0 if(!permitted) @@ -516,19 +516,23 @@ var/global/datum/controller/occupations/job_master H.species.equip(H) //Deferred item spawning. - if(spawn_in_storage && spawn_in_storage.len) - var/obj/item/weapon/storage/B - for(var/obj/item/weapon/storage/S in H.contents) - B = S - break + for(var/thing in spawn_in_storage) + var/datum/gear/G = gear_datums[thing] + var/metadata = H.client.prefs.gear[G.display_name] + var/item = G.spawn_item(null, metadata) - if(!isnull(B)) - for(var/thing in spawn_in_storage) - H << "Placing \the [thing] in your [B.name]!" - var/datum/gear/G = gear_datums[thing] - G.spawn_item(B) - else - H << "Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug." + var/atom/placed_in = H.equip_or_collect(item) + if(placed_in) + to_chat(H, "Placing \the [item] in your [placed_in.name]!") + continue + if(H.equip_to_appropriate_slot(item)) + to_chat(H, "Placing \the [item] in your inventory!") + continue + if(H.put_in_hands(item)) + to_chat(H, "Placing \the [item] in your hands!") + continue + to_chat(H, "Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug.") + qdel(item) to_chat(H, "You are the [alt_title ? alt_title : rank].") diff --git a/code/modules/client/preference/loadout/gear_tweaks.dm b/code/modules/client/preference/loadout/gear_tweaks.dm new file mode 100644 index 00000000000..18a2af836a7 --- /dev/null +++ b/code/modules/client/preference/loadout/gear_tweaks.dm @@ -0,0 +1,144 @@ +/datum/gear_tweak/proc/get_contents(var/metadata) + return + +/datum/gear_tweak/proc/get_metadata(var/user, var/metadata) + return + +/datum/gear_tweak/proc/get_default() + return + +/datum/gear_tweak/proc/tweak_gear_data(var/metadata, var/datum/gear_data) + return + +/datum/gear_tweak/proc/tweak_item(var/obj/item/I, var/metadata) + return + +/* +* Color adjustment +*/ + +var/datum/gear_tweak/color/gear_tweak_free_color_choice = new() + +/datum/gear_tweak/color + var/list/valid_colors + +/datum/gear_tweak/color/New(var/list/colors) + valid_colors = colors + ..() + +/datum/gear_tweak/color/get_contents(var/metadata) + return "Color: " + +/datum/gear_tweak/color/get_default() + return valid_colors ? valid_colors[1] : COLOR_GRAY + +/datum/gear_tweak/color/get_metadata(var/user, var/metadata) + if(valid_colors) + return input(user, "Choose an item color.", "Character Preference", metadata) as null|anything in valid_colors + return input(user, "Choose an item color.", "Global Preference", metadata) as color|null + +/datum/gear_tweak/color/tweak_item(var/obj/item/I, var/metadata) + if(valid_colors && !(metadata in valid_colors)) + return + I.color = metadata + +/* +* Path adjustment +*/ + +/datum/gear_tweak/path + var/list/valid_paths + +/datum/gear_tweak/path/New(var/list/paths) + valid_paths = paths + ..() + +/datum/gear_tweak/path/get_contents(var/metadata) + return "Type: [metadata]" + +/datum/gear_tweak/path/get_default() + return valid_paths[1] + +/datum/gear_tweak/path/get_metadata(var/user, var/metadata) + return input(user, "Choose a type.", "Character Preference", metadata) as null|anything in valid_paths + +/datum/gear_tweak/path/tweak_gear_data(var/metadata, var/datum/gear_data/gear_data) + if(!(metadata in valid_paths)) + return + gear_data.path = valid_paths[metadata] + +/* +* Content adjustment +*/ + +/datum/gear_tweak/contents + var/list/valid_contents + +/datum/gear_tweak/contents/New() + valid_contents = args.Copy() + ..() + +/datum/gear_tweak/contents/get_contents(var/metadata) + return "Contents: [english_list(metadata, and_text = ", ")]" + +/datum/gear_tweak/contents/get_default() + . = list() + for(var/i = 1 to valid_contents.len) + . += "Random" + +/datum/gear_tweak/contents/get_metadata(var/user, var/list/metadata) + . = list() + for(var/i = metadata.len to valid_contents.len) + metadata += "Random" + for(var/i = 1 to valid_contents.len) + var/entry = input(user, "Choose an entry.", "Character Preference", metadata[i]) as null|anything in (valid_contents[i] + list("Random", "None")) + if(entry) + . += entry + else + return metadata + +/datum/gear_tweak/contents/tweak_item(var/obj/item/I, var/list/metadata) + if(metadata.len != valid_contents.len) + return + for(var/i = 1 to valid_contents.len) + var/path + var/list/contents = valid_contents[i] + if(metadata[i] == "Random") + path = pick(contents) + path = contents[path] + else if(metadata[i] == "None") + continue + else + path = contents[metadata[i]] + new path(I) + +/* +* Ragent adjustment +*/ + +/datum/gear_tweak/reagents + var/list/valid_reagents + +/datum/gear_tweak/reagents/New(var/list/reagents) + valid_reagents = reagents.Copy() + ..() + +/datum/gear_tweak/reagents/get_contents(var/metadata) + return "Reagents: [metadata]" + +/datum/gear_tweak/reagents/get_default() + return "Random" + +/datum/gear_tweak/reagents/get_metadata(var/user, var/list/metadata) + . = input(user, "Choose an entry.", "Character Preference", metadata) as null|anything in (valid_reagents + list("Random", "None")) + if(!.) + return metadata + +/datum/gear_tweak/reagents/tweak_item(var/obj/item/I, var/list/metadata) + if(metadata == "None") + return + if(metadata == "Random") + . = valid_reagents[pick(valid_reagents)] + else + . = valid_reagents[metadata] + I.reagents.add_reagent(., I.reagents.get_free_space()) \ No newline at end of file diff --git a/code/modules/client/preference/loadout/loadout.dm b/code/modules/client/preference/loadout/loadout.dm index 9a369331534..331299d4820 100644 --- a/code/modules/client/preference/loadout/loadout.dm +++ b/code/modules/client/preference/loadout/loadout.dm @@ -68,7 +68,11 @@ var/list/gear_datums = list() path = npath location = nlocation -/datum/gear/proc/spawn_item(var/location) +/datum/gear/proc/spawn_item(location, metadata) var/datum/gear_data/gd = new(path, location) + for(var/datum/gear_tweak/gt in gear_tweaks) + gt.tweak_gear_data(metadata["[gt]"], gd) var/item = new gd.path(gd.location) + for(var/datum/gear_tweak/gt in gear_tweaks) + gt.tweak_item(item, metadata["[gt]"]) return item \ No newline at end of file diff --git a/code/modules/client/preference/loadout/loadout_uniform.dm b/code/modules/client/preference/loadout/loadout_uniform.dm index ed1d689b6cf..07c8a2d440b 100644 --- a/code/modules/client/preference/loadout/loadout_uniform.dm +++ b/code/modules/client/preference/loadout/loadout_uniform.dm @@ -4,6 +4,17 @@ slot = slot_w_uniform sort_category = "Uniforms and Casual Dress" +/datum/gear/uniform/skirt + display_name = "skirt" + +/datum/gear/uniform/skirt/New() + ..() + var/list/jumpskirts = list() + for(var/jump in subtypesof(/obj/item/clothing/under1)) + if(findtext(path2text(jump), "skirt")) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(skirt_list)) + + /datum/gear/uniform/skirt display_name = "plaid skirt, blue" path = /obj/item/clothing/under/dress/plaid_blue diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 82f587a7f2b..009599f00de 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -456,6 +456,11 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "[G.display_name]" dat += "[G.cost]" dat += "[G.description]" + if(ticked) + . += "" + for(var/datum/gear_tweak/tweak in G.gear_tweaks) + . += " [tweak.get_contents(get_tweak_metadata(G, tweak))]" + . += "" dat += "" dat += "
" @@ -470,6 +475,25 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts popup.set_content(dat) popup.open(0) + +/datum/preferences/proc/get_gear_metadata(var/datum/gear/G) + . = gear[G.display_name] + if(!.) + . = list() + gear[G.display_name] = . + +/datum/preferences/proc/get_tweak_metadata(var/datum/gear/G, var/datum/gear_tweak/tweak) + var/list/metadata = get_gear_metadata(G) + . = metadata["[tweak]"] + if(!.) + . = tweak.get_default() + metadata["[tweak]"] = . + +/datum/preferences/proc/set_tweak_metadata(var/datum/gear/G, var/datum/gear_tweak/tweak, var/new_metadata) + var/list/metadata = get_gear_metadata(G) + metadata["[tweak]"] = new_metadata + + /datum/preferences/proc/SetChoices(mob/user, limit = 12, list/splitJobs = list("Civilian","Research Director","AI","Bartender"), width = 760, height = 790) if(!job_master) return @@ -1035,6 +1059,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(istype(G)) total_cost += G.cost if((total_cost+TG.cost) <= MAX_GEAR_COST) gear += TG.display_name + else if(href_list["gear"] && href_list["tweak"]) + var/datum/gear/gear = gear_datums[href_list["gear"]] + var/datum/gear_tweak/tweak = locate(href_list["tweak"]) + if(!tweak || !istype(gear) || !(tweak in gear.gear_tweaks)) + return + var/metadata = tweak.get_metadata(user, get_tweak_metadata(gear, tweak)) + if(!metadata || !CanUseTopic(user)) + return + set_tweak_metadata(gear, tweak, metadata) else if(href_list["select_category"]) gear_tab = href_list["select_category"] else if(href_list["clear_loadout"]) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e5661f10ea5..5e715255999 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -245,6 +245,7 @@ return // Bag could not be placed in players hands. I don't know what to do here... //Now, B represents a container we can insert W into. B.handle_item_insertion(W,1) + return B //The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot. var/list/slot_equipment_priority = list( \ diff --git a/paradise.dme b/paradise.dme index 4c94b33990b..de38a0c6b57 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1116,9 +1116,9 @@ #include "code\modules\client\preference\preferences_mysql.dm" #include "code\modules\client\preference\preferences_spawnpoints.dm" #include "code\modules\client\preference\preferences_toggles.dm" +#include "code\modules\client\preference\loadout\gear_tweaks.dm" #include "code\modules\client\preference\loadout\loadout.dm" #include "code\modules\client\preference\loadout\loadout_accessories.dm" -#include "code\modules\client\preference\loadout\loadout_cosmetics.dm" #include "code\modules\client\preference\loadout\loadout_general.dm" #include "code\modules\client\preference\loadout\loadout_uniform.dm" #include "code\modules\clothing\clothing.dm"