From 1b8c9ea2cb3063e26b5d63e266dc694c6bb7739d Mon Sep 17 00:00:00 2001 From: AndrewJacksonThe2nd Date: Sat, 7 Nov 2015 12:37:38 -0800 Subject: [PATCH 01/12] STUN NERF --- code/game/objects/items/weapons/stunbaton.dm | 4 ++-- code/game/turfs/simulated.dm | 4 ++-- code/modules/projectiles/projectile/bullets.dm | 8 ++++---- code/modules/projectiles/projectile/energy.dm | 10 +++++----- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 94cbcb56fa2..9b8ad10dde7 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -9,7 +9,7 @@ w_class = 3 origin_tech = "combat=2" attack_verb = list("beaten") - var/stunforce = 7 + var/stunforce = 5 var/status = 0 var/obj/item/weapon/stock_parts/cell/high/bcell = null var/hitcost = 1000 @@ -172,6 +172,6 @@ item_state = "prod" force = 3 throwforce = 5 - stunforce = 5 + stunforce = 3 hitcost = 2500 slot_flags = null diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index afc9f6d8e84..53015cd4302 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -46,11 +46,11 @@ var/mob/living/carbon/M = A switch(wet) if(TURF_WET_WATER) - if(!M.slip(4, 2, null, NO_SLIP_WHEN_WALKING)) + if(!M.slip(2, 1, null, NO_SLIP_WHEN_WALKING)) M.inertia_dir = 0 return if(TURF_WET_LUBE) - M.slip(0, 7, null, (SLIDE|GALOSHES_DONT_HELP)) + M.slip(0, 4, null, (SLIDE|GALOSHES_DONT_HELP)) /turf/simulated/ChangeTurf(var/path) . = ..() diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index fda0ec76a94..3dc3fd238e4 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -61,8 +61,8 @@ /obj/item/projectile/bullet/stunshot //taser slugs for shotguns, nothing special name = "stunshot" damage = 5 - stun = 5 - weaken = 5 + stun = 3 + weaken = 3 stutter = 5 jitter = 20 range = 7 @@ -98,8 +98,8 @@ icon = 'icons/obj/meteor.dmi' icon_state = "dust" damage = 30 - weaken = 8 - stun = 8 + weaken = 4 + stun = 4 hitsound = 'sound/effects/meteorimpact.ogg' /obj/item/projectile/bullet/meteorshot/on_hit(atom/target, blocked = 0) diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 6389420a916..6858a097262 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -11,8 +11,8 @@ icon_state = "spark" color = "#FFFF00" nodamage = 1 - stun = 5 - weaken = 5 + stun = 3 + weaken = 3 stutter = 5 jitter = 20 hitsound = 'sound/weapons/taserhit.ogg' @@ -122,7 +122,7 @@ icon_state = "toxin" damage = 5 damage_type = TOX - weaken = 5 + weaken = 2 range = 7 /obj/item/projectile/energy/bolt //ebow bolts @@ -131,8 +131,8 @@ damage = 15 damage_type = TOX nodamage = 0 - weaken = 5 - stutter = 5 + weaken = 2 + stutter = 2 /obj/item/projectile/energy/bolt/large damage = 20 From 44e1b2d26488f88e179bd51791fb55f8900648d1 Mon Sep 17 00:00:00 2001 From: AndrewJacksonThe2nd Date: Sat, 7 Nov 2015 12:47:28 -0800 Subject: [PATCH 02/12] forgot some nerfs --- code/modules/projectiles/projectile/bullets.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 3dc3fd238e4..6031c5bb636 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -14,7 +14,7 @@ /obj/item/projectile/bullet/weakbullet2 //detective revolver instastuns, but multiple shots are better for keeping punks down damage = 15 weaken = 3 - stamina = 50 + stamina = 25 /obj/item/projectile/bullet/weakbullet3 damage = 20 @@ -42,7 +42,7 @@ /obj/item/projectile/bullet/midbullet damage = 20 - stamina = 65 //two round bursts from the c20r knocks people down + stamina = 35 /obj/item/projectile/bullet/midbullet2 From d80a56cde1650e0374fade96a8b29f6ead25db26 Mon Sep 17 00:00:00 2001 From: AndrewJacksonThe2nd Date: Sun, 8 Nov 2015 21:17:50 -0800 Subject: [PATCH 04/12] Revert "STUN NERF" This reverts commit 1b8c9ea2cb3063e26b5d63e266dc694c6bb7739d. --- code/game/objects/items/weapons/stunbaton.dm | 4 ++-- code/game/turfs/simulated.dm | 4 ++-- code/modules/projectiles/projectile/bullets.dm | 12 ++++++------ code/modules/projectiles/projectile/energy.dm | 10 +++++----- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 9b8ad10dde7..94cbcb56fa2 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -9,7 +9,7 @@ w_class = 3 origin_tech = "combat=2" attack_verb = list("beaten") - var/stunforce = 5 + var/stunforce = 7 var/status = 0 var/obj/item/weapon/stock_parts/cell/high/bcell = null var/hitcost = 1000 @@ -172,6 +172,6 @@ item_state = "prod" force = 3 throwforce = 5 - stunforce = 3 + stunforce = 5 hitcost = 2500 slot_flags = null diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 53015cd4302..afc9f6d8e84 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -46,11 +46,11 @@ var/mob/living/carbon/M = A switch(wet) if(TURF_WET_WATER) - if(!M.slip(2, 1, null, NO_SLIP_WHEN_WALKING)) + if(!M.slip(4, 2, null, NO_SLIP_WHEN_WALKING)) M.inertia_dir = 0 return if(TURF_WET_LUBE) - M.slip(0, 4, null, (SLIDE|GALOSHES_DONT_HELP)) + M.slip(0, 7, null, (SLIDE|GALOSHES_DONT_HELP)) /turf/simulated/ChangeTurf(var/path) . = ..() diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 6031c5bb636..fda0ec76a94 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -14,7 +14,7 @@ /obj/item/projectile/bullet/weakbullet2 //detective revolver instastuns, but multiple shots are better for keeping punks down damage = 15 weaken = 3 - stamina = 25 + stamina = 50 /obj/item/projectile/bullet/weakbullet3 damage = 20 @@ -42,7 +42,7 @@ /obj/item/projectile/bullet/midbullet damage = 20 - stamina = 35 + stamina = 65 //two round bursts from the c20r knocks people down /obj/item/projectile/bullet/midbullet2 @@ -61,8 +61,8 @@ /obj/item/projectile/bullet/stunshot //taser slugs for shotguns, nothing special name = "stunshot" damage = 5 - stun = 3 - weaken = 3 + stun = 5 + weaken = 5 stutter = 5 jitter = 20 range = 7 @@ -98,8 +98,8 @@ icon = 'icons/obj/meteor.dmi' icon_state = "dust" damage = 30 - weaken = 4 - stun = 4 + weaken = 8 + stun = 8 hitsound = 'sound/effects/meteorimpact.ogg' /obj/item/projectile/bullet/meteorshot/on_hit(atom/target, blocked = 0) diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 6858a097262..6389420a916 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -11,8 +11,8 @@ icon_state = "spark" color = "#FFFF00" nodamage = 1 - stun = 3 - weaken = 3 + stun = 5 + weaken = 5 stutter = 5 jitter = 20 hitsound = 'sound/weapons/taserhit.ogg' @@ -122,7 +122,7 @@ icon_state = "toxin" damage = 5 damage_type = TOX - weaken = 2 + weaken = 5 range = 7 /obj/item/projectile/energy/bolt //ebow bolts @@ -131,8 +131,8 @@ damage = 15 damage_type = TOX nodamage = 0 - weaken = 2 - stutter = 2 + weaken = 5 + stutter = 5 /obj/item/projectile/energy/bolt/large damage = 20 From c0d06a3f205026fbc046c4c4d54b856bbf5ed59b Mon Sep 17 00:00:00 2001 From: duncathan Date: Fri, 4 Dec 2015 21:48:14 -0600 Subject: [PATCH 05/12] next commit, goof, I swear --- code/datums/mind.dm | 24 ++++++++++---------- code/game/gamemodes/objective.dm | 38 +++++++++++++++++++------------- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 7665cab7c84..2e81a77a8c0 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -613,20 +613,18 @@ if (href_list["obj_edit"]) objective = locate(href_list["obj_edit"]) - if (!objective) return - objective_pos = objectives.Find(objective) + if (!objective) return //sanity + def_value = objective.type - //Text strings are easy to manipulate. Revised for simplicity. - var/temp_obj_type = "[objective.type]"//Convert path into a text string. - def_value = copytext(temp_obj_type, 19)//Convert last part of path into an objective keyword. - if(!def_value)//If it's a custom objective, it will be an empty string. - def_value = "custom" - - var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "maroon", "debrain", "protect", "destroy", "prevent", "hijack", "escape", "survive", "martyr", "steal", "download", "nuclear", "capture", "absorb", "custom") + var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in (typesof(datum/objective) - list(/datum/objective, /datum/objective/default, /datum/objective/escape_obj, /datum/objective/changeling_team_objective)) //keep out the abstract ones if (!new_obj_type) return + if (initial(new_obj_type.required_role) != special_role) + if(alert("The objective requires a special_role that this mind does not have. The player may not be able to complete the objective. Are you sure you want to continue?", Button1="Yes",Button2="No") == "No") + return - var/datum/objective/new_objective = null + var/datum/objective/new_objective = add_objective(src, new_obj_type) + /* switch (new_obj_type) if ("assassinate","protect","debrain","maroon") var/list/possible_targets = list("Free objective") @@ -728,8 +726,10 @@ new_objective = new /datum/objective new_objective.owner = src new_objective.explanation_text = expl - - if (!new_objective) return + */ + if (!new_objective) + usr << initial(new_obj_type.error_text) + return if (objective) objectives -= objective diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index fe214fd628b..48d4fd49c57 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1,3 +1,6 @@ +#define ABSTRACT_OBJECTIVES //better way of doing this? var on datum/objective? +var/list/types_of_objectives = - ABSTRACT_OBJECTIVES + /datum/objective var/datum/mind/owner = null //Who owns the objective. var/explanation_text = "Nothing" //What that person is supposed to do. @@ -7,7 +10,9 @@ var/dangerrating = 0 //How hard the objective is, essentially. Used for dishing out objectives and checking overall victory. var/martyr_compatible = 0 //If the objective is compatible with martyr objective, i.e. if you can still do it while dead. var/required_role = null //If the objective can only be done by a certain role, such as absorb for changelings. - var/randomgen = 1 + var/randomgen = 1 //Whether the objective can be generated randomly. + var/error_text = "" //If the objective is impossible on creation (e.g. destroy the AI with no AIs on board) + //this text can be displayed. Useful for admin objective editing in mind/Topic(). /proc/generate_objectives(var/datum/mind/M, var/objectives_made = 2, var/has_escape = TRUE) var/list/objective_types = (typesof(/datum/objective/default) - /datum/objective/default) @@ -30,12 +35,19 @@ add_objective(M, holder_obj) -/proc/add_objective(var/datum/mind/M, var/datum/objective/O, var/announce_new_objectives = 0) - var/datum/objective/objective = new O +/proc/add_objective(var/datum/mind/M, var/obj_path, var/announce_new_objectives = 0, var/replace_if_impossible = 1, var/text) + var/datum/objective/objective = new obj_path(text) objective.owner = M M.objectives += objective objective.find_target() - objective.extra_prep() + + if(!objective.extra_prep()) + if(replace_if_impossible) + generate_objectives(objective.owner, 1, FALSE) // Generate another objective to replace this one. + objective.owner.objectives -= src + qdel(src) + return null + objective.update_explanation_text() if(announce_new_objectives) if(M.special_role) @@ -54,7 +66,7 @@ return completed /datum/objective/proc/extra_prep() - return + return 1 /datum/objective/proc/is_unique_objective(possible_target) for(var/datum/objective/O in owner.objectives) @@ -468,9 +480,7 @@ var/global/list/possible_items = list() if (new_target == "custom") //Can set custom items. var/obj/item/custom_target = input("Select type:","Type") as null|anything in typesof(/obj/item) if (!custom_target) return - var/tmp_obj = new custom_target - var/custom_name = tmp_obj:name - qdel(tmp_obj) + var/custom_name = initial(custom_target.name) custom_name = stripped_input("Enter target name:", "Objective target", custom_name) if (!custom_name) return steal_target = custom_target @@ -664,6 +674,7 @@ var/global/list/possible_items_special = list() /datum/objective/default/destroy dangerrating = 10 martyr_compatible = 1 + error_text = "No active AIs with minds." /datum/objective/default/destroy/find_target() var/list/possible_targets = active_ais(1) @@ -688,12 +699,8 @@ var/global/list/possible_items_special = list() /datum/objective/default/destroy/extra_prep() if(!target) - if(owner) - generate_objectives(owner, 1, FALSE) // Generate another objective to replace this one. - owner.objectives -= src - qdel(src) - return - return + return 0 + return 1 /datum/objective/summon_guns explanation_text = "Steal at least five guns!" @@ -882,4 +889,5 @@ var/global/list/possible_items_special = list() explanation_text = "Have X or more heads of staff escape on the shuttle disguised as heads, while the real heads are dead" command_staff_only = TRUE - +/datum/objective/custom + explanation_text = "Free Objective" \ No newline at end of file From eecb657deb4bb2119f979ee924cebb9a84daca2c Mon Sep 17 00:00:00 2001 From: duncathan Date: Tue, 8 Dec 2015 20:17:41 -0600 Subject: [PATCH 06/12] finishes up mind.dm --- code/datums/mind.dm | 132 +++++-------------------------- code/game/gamemodes/objective.dm | 62 +++++++++------ 2 files changed, 60 insertions(+), 134 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 2e81a77a8c0..107254a6cf8 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -594,16 +594,19 @@ /datum/mind/Topic(href, href_list) - if(!check_rights(R_ADMIN)) return + if(!check_rights(R_ADMIN)) + return if (href_list["role_edit"]) var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in get_all_jobs() - if (!new_role) return + if (!new_role) + return assigned_role = new_role else if (href_list["memory_edit"]) var/new_memo = copytext(sanitize(input("Write new memory", "Memory", memory) as null|message),1,MAX_MESSAGE_LEN) - if (isnull(new_memo)) return + if (isnull(new_memo)) + return memory = new_memo else if (href_list["obj_edit"] || href_list["obj_add"]) @@ -613,120 +616,25 @@ if (href_list["obj_edit"]) objective = locate(href_list["obj_edit"]) - if (!objective) return //sanity + if (!objective) + return //sanity def_value = objective.type - var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in (typesof(datum/objective) - list(/datum/objective, /datum/objective/default, /datum/objective/escape_obj, /datum/objective/changeling_team_objective)) //keep out the abstract ones - if (!new_obj_type) return + var/datum/objective/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in (typesof(/datum/objective) - list(/datum/objective, /datum/objective/default, /datum/objective/escape_obj, /datum/objective/changeling_team_objective)) //keep out the abstract ones + if (!new_obj_type) + return if (initial(new_obj_type.required_role) != special_role) - if(alert("The objective requires a special_role that this mind does not have. The player may not be able to complete the objective. Are you sure you want to continue?", Button1="Yes",Button2="No") == "No") + if(alert("The objective requires a special_role that this mind does not have. The player may not be able to complete the objective. Are you sure you want to continue?","uh oh" ,"Yes", "No") == "No") return var/datum/objective/new_objective = add_objective(src, new_obj_type) - /* - switch (new_obj_type) - if ("assassinate","protect","debrain","maroon") - var/list/possible_targets = list("Free objective") - for(var/datum/mind/possible_target in ticker.minds) - if ((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human)) - possible_targets += possible_target.current + if (istype(new_objective, /datum/objective/custom)) //it's lame I know but this type is snowflaky by its very nature + var/expl = stripped_input(usr, "Custom objective:", "Objective", objective ? objective.explanation_text : "") + if (!expl) + expl = "Free objective" + new_objective.explanation_text = expl - var/mob/def_target = null - var/objective_list[] = list(/datum/objective/default/assassinate, /datum/objective/default/protect, /datum/objective/default/debrain, /datum/objective/default/maroon) - if (objective&&(objective.type in objective_list) && objective:target) - def_target = objective:target.current - - var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets - if (!new_target) return - - var/objective_path = text2path("/datum/objective/[new_obj_type]") - if (new_target == "Free objective") - new_objective = new objective_path - new_objective.owner = src - new_objective:target = null - new_objective.explanation_text = "Free objective" - else - new_objective = new objective_path - new_objective.owner = src - new_objective:target = new_target:mind - //Will display as special role if the target is set as MODE. Ninjas/commandos/nuke ops. - new_objective.update_explanation_text() - - if ("destroy") - var/list/possible_targets = active_ais(1) - if(possible_targets.len) - var/mob/new_target = input("Select target:", "Objective target") as null|anything in possible_targets - new_objective = new /datum/objective/default/destroy - new_objective.target = new_target.mind - new_objective.owner = src - new_objective.update_explanation_text() - else - usr << "No active AIs with minds" - - if ("prevent") - new_objective = new /datum/objective/escape_obj/block - new_objective.owner = src - - if ("hijack") - new_objective = new /datum/objective/escape_obj/hijack - new_objective.owner = src - - if ("escape") - new_objective = new /datum/objective/escape_obj/escape - new_objective.owner = src - - if ("survive") - new_objective = new /datum/objective/escape_obj/survive - new_objective.owner = src - - if("martyr") - new_objective = new /datum/objective/escape_obj/martyr - new_objective.owner = src - - if ("nuclear") - new_objective = new /datum/objective/nuclear - new_objective.owner = src - - if ("steal") - if (!istype(objective, /datum/objective/default/steal)) - new_objective = new /datum/objective/default/steal - new_objective.owner = src - else - new_objective = objective - var/datum/objective/default/steal/steal = new_objective - if (!steal.select_target()) - return - - if("download","capture","absorb") - var/def_num - if(objective&&objective.type==text2path("/datum/objective/[new_obj_type]")) - def_num = objective.target_amount - - var/target_number = input("Input target number:", "Objective", def_num) as num|null - if (isnull(target_number))//Ordinarily, you wouldn't need isnull. In this case, the value may already exist. - return - - switch(new_obj_type) - if("download") - new_objective = new /datum/objective/download - new_objective.explanation_text = "Download [target_number] research levels." - if("capture") - new_objective = new /datum/objective/capture - new_objective.explanation_text = "Capture [target_number] lifeforms with an energy net. Live, rare specimens are worth more." - if("absorb") - new_objective = new /datum/objective/default/absorb - new_objective.explanation_text = "Absorb [target_number] compatible genomes." - new_objective.owner = src - new_objective.target_amount = target_number - - if ("custom") - var/expl = stripped_input(usr, "Custom objective:", "Objective", objective ? objective.explanation_text : "") - if (!expl) return - new_objective = new /datum/objective - new_objective.owner = src - new_objective.explanation_text = expl - */ if (!new_objective) usr << initial(new_obj_type.error_text) return @@ -743,14 +651,16 @@ else if (href_list["obj_delete"]) var/datum/objective/objective = locate(href_list["obj_delete"]) - if(!istype(objective)) return + if(!istype(objective)) + return objectives -= objective message_admins("[key_name_admin(usr)] removed an objective for [current]: [objective.explanation_text]") log_admin("[key_name(usr)] removed an objective for [current]: [objective.explanation_text]") else if(href_list["obj_completed"]) var/datum/objective/objective = locate(href_list["obj_completed"]) - if(!istype(objective)) return + if(!istype(objective)) + return objective.completed = !objective.completed log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 48d4fd49c57..529754419fe 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1,7 +1,4 @@ -#define ABSTRACT_OBJECTIVES //better way of doing this? var on datum/objective? -var/list/types_of_objectives = - ABSTRACT_OBJECTIVES - -/datum/objective +/datum/objective/ var/datum/mind/owner = null //Who owns the objective. var/explanation_text = "Nothing" //What that person is supposed to do. var/datum/mind/target = null //If they are focused on a particular person. @@ -11,8 +8,7 @@ var/list/types_of_objectives = - ABSTRACT_OBJECTIVES var/martyr_compatible = 0 //If the objective is compatible with martyr objective, i.e. if you can still do it while dead. var/required_role = null //If the objective can only be done by a certain role, such as absorb for changelings. var/randomgen = 1 //Whether the objective can be generated randomly. - var/error_text = "" //If the objective is impossible on creation (e.g. destroy the AI with no AIs on board) - //this text can be displayed. Useful for admin objective editing in mind/Topic(). + var/error_text = "" //Displayed to admins if the objective fails to initialize properly when editing or adding /proc/generate_objectives(var/datum/mind/M, var/objectives_made = 2, var/has_escape = TRUE) var/list/objective_types = (typesof(/datum/objective/default) - /datum/objective/default) @@ -35,11 +31,14 @@ var/list/types_of_objectives = - ABSTRACT_OBJECTIVES add_objective(M, holder_obj) -/proc/add_objective(var/datum/mind/M, var/obj_path, var/announce_new_objectives = 0, var/replace_if_impossible = 1, var/text) - var/datum/objective/objective = new obj_path(text) +/proc/add_objective(var/datum/mind/M, var/obj_path, var/announce_new_objectives = 0, var/replace_if_impossible = 1, var/admin=0) + var/datum/objective/objective = new obj_path() objective.owner = M M.objectives += objective - objective.find_target() + if(admin && check_rights(R_ADMIN)) + objective.find_target_admin() + else + objective.find_target() if(!objective.extra_prep()) if(replace_if_impossible) @@ -77,16 +76,24 @@ var/list/types_of_objectives = - ABSTRACT_OBJECTIVES /datum/objective/proc/get_target() return target -/datum/objective/proc/find_target() +/datum/objective/proc/find_possible_targets() var/list/possible_targets = list() for(var/datum/mind/possible_target in ticker.minds) if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && is_unique_objective(possible_target)) possible_targets += possible_target + return possible_targets + +/datum/objective/proc/find_target() + var/list/possible_targets = find_possible_targets() if(possible_targets.len > 0) target = pick(possible_targets) update_explanation_text() return target +/datum/objective/proc/find_target_admin() + target = input("Select target:", "Objective target") as null|anything in find_possible_targets() + return target + /datum/objective/proc/find_target_by_role(role, role_type=0, invert=0)//Option sets either to check assigned role or special role. Default to assigned., invert inverts the check, eg: "Don't choose a Ling" for(var/datum/mind/possible_target in ticker.minds) if((possible_target != owner) && ishuman(possible_target.current)) @@ -452,12 +459,18 @@ var/global/list/possible_items = list() if(!possible_items.len)//Only need to fill the list when it's needed. init_subtypes(/datum/objective_item/steal,possible_items) +/datum/objective/default/steal/find_possible_targets() + var/list/approved_targets = list() + if(check_rights(R_ADMIN)) + approved_targets += select_target() + else + for(var/datum/objective_item/possible_item in possible_items) + if(is_unique_objective(possible_item.targetitem) && !(owner.current.mind.assigned_role in possible_item.excludefromjob)) + approved_targets += possible_item + return approved_targets + /datum/objective/default/steal/find_target() - var/approved_targets = list() - for(var/datum/objective_item/possible_item in possible_items) - if(is_unique_objective(possible_item.targetitem) && !(owner.current.mind.assigned_role in possible_item.excludefromjob)) - approved_targets += possible_item - return set_target(safepick(approved_targets)) + return set_target(safepick(find_possible_targets())) /datum/objective/default/steal/proc/set_target(datum/objective_item/item) if(item) @@ -475,24 +488,27 @@ var/global/list/possible_items = list() /datum/objective/default/steal/proc/select_target() //For admins setting objectives manually. var/list/possible_items_all = possible_items+"custom" var/new_target = input("Select target:", "Objective target", steal_target) as null|anything in possible_items_all - if (!new_target) return + if (!new_target) + return if (new_target == "custom") //Can set custom items. var/obj/item/custom_target = input("Select type:","Type") as null|anything in typesof(/obj/item) - if (!custom_target) return + if (!custom_target) + return var/custom_name = initial(custom_target.name) custom_name = stripped_input("Enter target name:", "Objective target", custom_name) - if (!custom_name) return + if (!custom_name) + return steal_target = custom_target explanation_text = "Steal [custom_name]." - else - set_target(new_target) return steal_target /datum/objective/default/steal/check_completion() - if(!steal_target) return 1 - if(!isliving(owner.current)) return 0 + if(!steal_target) + return 1 + if(!isliving(owner.current)) + return 0 var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc. for(var/obj/I in all_items) //Check for items @@ -699,7 +715,7 @@ var/global/list/possible_items_special = list() /datum/objective/default/destroy/extra_prep() if(!target) - return 0 + return 0 return 1 /datum/objective/summon_guns From 799a406af44a3d7f8bab903bad2a259c01e78b19 Mon Sep 17 00:00:00 2001 From: AndrewJacksonThe2nd Date: Mon, 28 Dec 2015 15:23:42 -0800 Subject: [PATCH 07/12] New Frame Objective, compile fixes --- code/datums/mind.dm | 183 ++++----------------------- code/game/gamemodes/antag_spawner.dm | 7 +- code/game/gamemodes/objective.dm | 60 ++++++++- data/mode.txt | 2 +- 4 files changed, 87 insertions(+), 165 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 6de0df6ab18..784e17ea883 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -592,6 +592,7 @@ usr << browse(out, "window=edit_memory[src];size=500x600") + /datum/mind/Topic(href, href_list) if(!check_rights(R_ADMIN)) return @@ -627,8 +628,6 @@ return var/datum/objective/new_objective = add_objective(src, new_obj_type) - var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "maroon", "debrain", "protect", "destroy", "prevent", "hijack", "escape", "survive", "martyr", "steal", "download", "nuclear", "capture", "absorb", "custom","follower block (HOG)","build (HOG)","deicide (HOG)", "follower escape (HOG)", "sacrifice prophet (HOG)") - if (!new_obj_type) return if (istype(new_objective, /datum/objective/custom)) //it's lame I know but this type is snowflaky by its very nature var/expl = stripped_input(usr, "Custom objective:", "Objective", objective ? objective.explanation_text : "") @@ -640,119 +639,6 @@ usr << initial(new_obj_type.error_text) return - var/mob/def_target = null - var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain, /datum/objective/maroon) - if (objective&&(objective.type in objective_list) && objective:target) - def_target = objective:target.current - - var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets - if (!new_target) return - - var/objective_path = text2path("/datum/objective/[new_obj_type]") - if (new_target == "Free objective") - new_objective = new objective_path - new_objective.owner = src - new_objective:target = null - new_objective.explanation_text = "Free objective" - else - new_objective = new objective_path - new_objective.owner = src - new_objective:target = new_target:mind - //Will display as special role if the target is set as MODE. Ninjas/commandos/nuke ops. - new_objective.update_explanation_text() - - if ("destroy") - var/list/possible_targets = active_ais(1) - if(possible_targets.len) - var/mob/new_target = input("Select target:", "Objective target") as null|anything in possible_targets - new_objective = new /datum/objective/destroy - new_objective.target = new_target.mind - new_objective.owner = src - new_objective.update_explanation_text() - else - usr << "No active AIs with minds" - - if ("prevent") - new_objective = new /datum/objective/block - new_objective.owner = src - - if ("hijack") - new_objective = new /datum/objective/hijack - new_objective.owner = src - - if ("escape") - new_objective = new /datum/objective/escape - new_objective.owner = src - - if ("survive") - new_objective = new /datum/objective/survive - new_objective.owner = src - - if("martyr") - new_objective = new /datum/objective/martyr - new_objective.owner = src - - if ("nuclear") - new_objective = new /datum/objective/nuclear - new_objective.owner = src - - if ("steal") - if (!istype(objective, /datum/objective/steal)) - new_objective = new /datum/objective/steal - new_objective.owner = src - else - new_objective = objective - var/datum/objective/steal/steal = new_objective - if (!steal.select_target()) - return - - if("download","capture","absorb") - var/def_num - if(objective&&objective.type==text2path("/datum/objective/[new_obj_type]")) - def_num = objective.target_amount - - var/target_number = input("Input target number:", "Objective", def_num) as num|null - if (isnull(target_number))//Ordinarily, you wouldn't need isnull. In this case, the value may already exist. - return - - switch(new_obj_type) - if("download") - new_objective = new /datum/objective/download - new_objective.explanation_text = "Download [target_number] research levels." - if("capture") - new_objective = new /datum/objective/capture - new_objective.explanation_text = "Capture [target_number] lifeforms with an energy net. Live, rare specimens are worth more." - if("absorb") - new_objective = new /datum/objective/absorb - new_objective.explanation_text = "Absorb [target_number] compatible genomes." - new_objective.owner = src - new_objective.target_amount = target_number - - if("follower block (HOG)") - new_objective = new /datum/objective/follower_block - new_objective.owner = src - if("build (HOG)") - new_objective = new /datum/objective/build - new_objective.owner = src - if("deicide (HOG)") - new_objective = new /datum/objective/deicide - new_objective.owner = src - if("follower escape (HOG)") - new_objective = new /datum/objective/escape_followers - new_objective.owner = src - if("sacrifice prophet (HOG)") - new_objective = new /datum/objective/sacrifice_prophet - new_objective.owner = src - - if ("custom") - var/expl = stripped_input(usr, "Custom objective:", "Objective", objective ? objective.explanation_text : "") - if (!expl) return - new_objective = new /datum/objective - new_objective.owner = src - new_objective.explanation_text = expl - - if (!new_objective) return - if (objective) objectives -= objective objectives.Insert(objective_pos, new_objective) @@ -778,46 +664,6 @@ objective.completed = !objective.completed log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") - else if (href_list["handofgod"]) - switch(href_list["handofgod"]) - if("clear") //wipe handofgod status - if((src in ticker.mode.red_deity_followers) || (src in ticker.mode.blue_deity_followers) || (src in ticker.mode.red_deity_prophets) || (src in ticker.mode.blue_deity_prophets)) - remove_hog_follower_prophet() - current << "You have been brainwashed... again! Your faith is no more!" - message_admins("[key_name_admin(usr)] has de-hand of god'ed [current].") - log_admin("[key_name(usr)] has de-hand of god'ed [current].") - - if("red follower") - make_Handofgod_follower("red") - message_admins("[key_name_admin(usr)] has red follower'ed [current].") - log_admin("[key_name(usr)] has red follower'ed [current].") - - if("red prophet") - make_Handofgod_prophet("red") - message_admins("[key_name_admin(usr)] has red prophet'ed [current].") - log_admin("[key_name(usr)] has red prophet'ed [current].") - - if("blue follower") - make_Handofgod_follower("blue") - message_admins("[key_name_admin(usr)] has blue follower'ed [current].") - log_admin("[key_name(usr)] has blue follower'ed [current].") - - if("blue prophet") - make_Handofgod_prophet("blue") - message_admins("[key_name_admin(usr)] has blue prophet'ed [current].") - log_admin("[key_name(usr)] has blue prophet'ed [current].") - - if("red god") - make_Handofgod_god("red") - message_admins("[key_name_admin(usr)] has red god'ed [current].") - log_admin("[key_name(usr)] has red god'ed [current].") - - if("blue god") - make_Handofgod_god("blue") - message_admins("[key_name_admin(usr)] has blue god'ed [current].") - log_admin("[key_name(usr)] has blue god'ed [current].") - - else if (href_list["revolution"]) switch(href_list["revolution"]) if("clear") @@ -972,9 +818,31 @@ ticker.mode.add_cultist(src) message_admins("[key_name_admin(usr)] has cult'ed [current].") log_admin("[key_name(usr)] has cult'ed [current].") - if("equip") + if("tome") + var/mob/living/carbon/human/H = current + if (istype(H)) + var/obj/item/weapon/tome/T = new(H) + + var/list/slots = list ( + "backpack" = slot_in_backpack, + "left pocket" = slot_l_store, + "right pocket" = slot_r_store, + "left hand" = slot_l_hand, + "right hand" = slot_r_hand, + ) + var/where = H.equip_in_one_of_slots(T, slots) + if (!where) + usr << "Spawning tome failed!" + else + H << "A tome, a message from your new master, appears in your [where]." + if(where == "backpack") + var/obj/item/weapon/storage/B = H.back + B.orient2hud(H) + B.show_to(H) + + if("amulet") if (!ticker.mode.equip_cultist(current)) - usr << "equip_cultist() failed! [current]'s starting equipment will be incomplete." + usr << "Spawning amulet failed!" else if (href_list["wizard"]) switch(href_list["wizard"]) @@ -1210,6 +1078,7 @@ else if (href_list["silicon"]) switch(href_list["silicon"]) + if("unemag") var/mob/living/silicon/robot/R = current if (istype(R)) diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 338fcaac4c7..d61bb3607e1 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -92,12 +92,13 @@ M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap." equip_antag(M) + var/mob/living/carbon/human/H = usr var/wizard_name_first = pick(wizard_first) var/wizard_name_second = pick(wizard_second) var/randomname = "[wizard_name_first] [wizard_name_second]" var/datum/objective/default/protect/new_objective = add_objective(M.mind, /datum/objective/default/protect) - new_objective.target = usr:mind - new_objective.explanation_text = "Protect [usr.real_name], the wizard." + new_objective.target = H.mind + new_objective.explanation_text = "Protect [H.real_name], the wizard." ticker.mode.apprentices += M.mind M.mind.special_role = "apprentice" ticker.mode.update_wiz_icons_added(M.mind) @@ -156,8 +157,6 @@ var/list/nuke_candidates = get_candidates(ROLE_OPERATIVE, 3000, "operative") if(nuke_candidates.len > 0) - var/list/borg_candicates = get_candidates(BE_OPERATIVE) - if(borg_candicates.len > 0) used = 1 var/client/C = pick(nuke_candidates) spawn_antag(C, get_turf(src.loc), "syndieborg") diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 54a3fb1db0e..d06afdbba54 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -13,10 +13,11 @@ /proc/generate_objectives(var/datum/mind/M, var/objectives_made = 2, var/has_escape = TRUE) var/list/objective_types = (typesof(/datum/objective/default) - /datum/objective/default) var/list/escape_objective_types = (typesof(/datum/objective/escape_obj) - /datum/objective/escape_obj) - for(var/datum/objective/O in objective_types) - if(O.required_role != M.special_role) + for(var/O in objective_types) // this is fucking hacky as shit but + var/datum/objective/obj = new O + if(M.special_role != obj.required_role && obj.required_role != null) objective_types -= O - if(!O.randomgen) + if(!obj.randomgen) objective_types -= O for(var/i = 1, i <= objectives_made, i++) if(i == objectives_made && has_escape) @@ -149,6 +150,59 @@ explanation_text = "Free Objective" +/datum/objective/default/frame + var/target_role_type=0 + dangerrating = 10 + martyr_compatible = 1 + +/datum/objective/default/frame/find_target_by_role(role, role_type=0, invert=0) + if(!invert) + target_role_type = role_type + ..() + return target + + +/datum/objective/default/frame/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Frame [target.name], the [!target_role_type ? target.assigned_role : target.special_role] and ensure they are incarcerated by the end of the shift." + else + explanation_text = "Free Objective" + +/datum/objective/default/frame/check_completion() + if(issilicon(target.current)) + return 0 + if(isbrain(target.current)) + return 0 + if(!target.current || target.current.stat == DEAD) + return 0 + if(ticker.force_ending) //This one isn't their fault, so lets just assume good faith + return 1 + if(ticker.mode.station_was_nuked) + return 1 + if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) + return 0 + var/turf/location = get_turf(target.current) + var/area/loc_area = get_area(target.current) + if(!location) + return 0 + + if(istype(location, /turf/simulated/floor/plasteel/shuttle/red)) + return 1 + if(istype(loc_area, /area/security/brig)) + return 1 + if(istype(loc_area, /area/security/prison)) + return 1 + if(istype(loc_area, /area/prison/solitary)) // dunno if some maps still have solitary, if so this works + return 1 + if(istype(loc_area, /area/mine/laborcamp)) + return 1 + if(istype(loc_area, /area/mine/laborcamp/security)) + return 1 + if(location.onCentcom() || location.onSyndieBase()) + return 0 + + /datum/objective/mutiny var/target_role_type=0 martyr_compatible = 1 diff --git a/data/mode.txt b/data/mode.txt index 076bf8fa12e..ef18df98db4 100644 --- a/data/mode.txt +++ b/data/mode.txt @@ -1 +1 @@ -traitor +extended From 081aa7099edf35d4973c0c4564b81d7d95ad8a38 Mon Sep 17 00:00:00 2001 From: AndrewJacksonThe2nd Date: Mon, 28 Dec 2015 16:31:30 -0800 Subject: [PATCH 08/12] Removes Frame, fixes --- code/datums/mind.dm | 63 ++++++++++++++++++++------------ code/game/gamemodes/objective.dm | 59 +++--------------------------- 2 files changed, 45 insertions(+), 77 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 784e17ea883..6c954f90309 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -663,6 +663,44 @@ return objective.completed = !objective.completed log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") + else if (href_list["handofgod"]) + switch(href_list["handofgod"]) + if("clear") //wipe handofgod status + if((src in ticker.mode.red_deity_followers) || (src in ticker.mode.blue_deity_followers) || (src in ticker.mode.red_deity_prophets) || (src in ticker.mode.blue_deity_prophets)) + remove_hog_follower_prophet() + current << "You have been brainwashed... again! Your faith is no more!" + message_admins("[key_name_admin(usr)] has de-hand of god'ed [current].") + log_admin("[key_name(usr)] has de-hand of god'ed [current].") + + if("red follower") + make_Handofgod_follower("red") + message_admins("[key_name_admin(usr)] has red follower'ed [current].") + log_admin("[key_name(usr)] has red follower'ed [current].") + + if("red prophet") + make_Handofgod_prophet("red") + message_admins("[key_name_admin(usr)] has red prophet'ed [current].") + log_admin("[key_name(usr)] has red prophet'ed [current].") + + if("blue follower") + make_Handofgod_follower("blue") + message_admins("[key_name_admin(usr)] has blue follower'ed [current].") + log_admin("[key_name(usr)] has blue follower'ed [current].") + + if("blue prophet") + make_Handofgod_prophet("blue") + message_admins("[key_name_admin(usr)] has blue prophet'ed [current].") + log_admin("[key_name(usr)] has blue prophet'ed [current].") + + if("red god") + make_Handofgod_god("red") + message_admins("[key_name_admin(usr)] has red god'ed [current].") + log_admin("[key_name(usr)] has red god'ed [current].") + + if("blue god") + make_Handofgod_god("blue") + message_admins("[key_name_admin(usr)] has blue god'ed [current].") + log_admin("[key_name(usr)] has blue god'ed [current].") else if (href_list["revolution"]) switch(href_list["revolution"]) @@ -818,31 +856,10 @@ ticker.mode.add_cultist(src) message_admins("[key_name_admin(usr)] has cult'ed [current].") log_admin("[key_name(usr)] has cult'ed [current].") - if("tome") - var/mob/living/carbon/human/H = current - if (istype(H)) - var/obj/item/weapon/tome/T = new(H) - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store, - "left hand" = slot_l_hand, - "right hand" = slot_r_hand, - ) - var/where = H.equip_in_one_of_slots(T, slots) - if (!where) - usr << "Spawning tome failed!" - else - H << "A tome, a message from your new master, appears in your [where]." - if(where == "backpack") - var/obj/item/weapon/storage/B = H.back - B.orient2hud(H) - B.show_to(H) - - if("amulet") + if("equip") if (!ticker.mode.equip_cultist(current)) - usr << "Spawning amulet failed!" + usr << "equip_cultist() failed! [current]'s starting equipment will be incomplete." else if (href_list["wizard"]) switch(href_list["wizard"]) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index d06afdbba54..1a119ff72ad 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1,4 +1,4 @@ -/datum/objective/ +/datum/objective var/datum/mind/owner = null //Who owns the objective. var/explanation_text = "Nothing" //What that person is supposed to do. var/datum/mind/target = null //If they are focused on a particular person. @@ -150,59 +150,6 @@ explanation_text = "Free Objective" -/datum/objective/default/frame - var/target_role_type=0 - dangerrating = 10 - martyr_compatible = 1 - -/datum/objective/default/frame/find_target_by_role(role, role_type=0, invert=0) - if(!invert) - target_role_type = role_type - ..() - return target - - -/datum/objective/default/frame/update_explanation_text() - ..() - if(target && target.current) - explanation_text = "Frame [target.name], the [!target_role_type ? target.assigned_role : target.special_role] and ensure they are incarcerated by the end of the shift." - else - explanation_text = "Free Objective" - -/datum/objective/default/frame/check_completion() - if(issilicon(target.current)) - return 0 - if(isbrain(target.current)) - return 0 - if(!target.current || target.current.stat == DEAD) - return 0 - if(ticker.force_ending) //This one isn't their fault, so lets just assume good faith - return 1 - if(ticker.mode.station_was_nuked) - return 1 - if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) - return 0 - var/turf/location = get_turf(target.current) - var/area/loc_area = get_area(target.current) - if(!location) - return 0 - - if(istype(location, /turf/simulated/floor/plasteel/shuttle/red)) - return 1 - if(istype(loc_area, /area/security/brig)) - return 1 - if(istype(loc_area, /area/security/prison)) - return 1 - if(istype(loc_area, /area/prison/solitary)) // dunno if some maps still have solitary, if so this works - return 1 - if(istype(loc_area, /area/mine/laborcamp)) - return 1 - if(istype(loc_area, /area/mine/laborcamp/security)) - return 1 - if(location.onCentcom() || location.onSyndieBase()) - return 0 - - /datum/objective/mutiny var/target_role_type=0 martyr_compatible = 1 @@ -499,6 +446,10 @@ explanation_text = "Destroy the station with a nuclear device." martyr_compatible = 1 +/datum/objective/nuclear/check_completion() + if(ticker && ticker.mode && ticker.mode.station_was_nuked) + return 1 + return 0 var/global/list/possible_items = list() /datum/objective/default/steal From 7bfc5fb4e54eb0b351ed1fde830a2b8caae0690f Mon Sep 17 00:00:00 2001 From: AndrewJacksonThe2nd Date: Mon, 28 Dec 2015 19:22:20 -0800 Subject: [PATCH 09/12] disables Debrain from random objective generation --- code/game/gamemodes/objective.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 1a119ff72ad..5c739878e58 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -209,6 +209,7 @@ /datum/objective/default/debrain//I want braaaainssss var/target_role_type=0 dangerrating = 20 + randomgen = 0 /datum/objective/default/debrain/find_target_by_role(role, role_type=0, invert=0) if(!invert) From 629863fbae24bd26a6ad540b4dd972825b46f56e Mon Sep 17 00:00:00 2001 From: AndrewJacksonThe2nd Date: Mon, 28 Dec 2015 23:10:28 -0800 Subject: [PATCH 10/12] fixes --- code/datums/mind.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 6c954f90309..fd4db62865b 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -645,7 +645,6 @@ message_admins("[key_name_admin(usr)] edited [current]'s objective to [new_objective.explanation_text]") log_admin("[key_name(usr)] edited [current]'s objective to [new_objective.explanation_text]") else - objectives += new_objective message_admins("[key_name_admin(usr)] added a new objective for [current]: [new_objective.explanation_text]") log_admin("[key_name(usr)] added a new objective for [current]: [new_objective.explanation_text]") From 59d6768610611cca9606280ea3f25265cc8e97af Mon Sep 17 00:00:00 2001 From: AndrewJacksonThe2nd Date: Tue, 29 Dec 2015 22:00:24 -0800 Subject: [PATCH 11/12] fixes --- code/game/gamemodes/objective.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 5c739878e58..20fd2a4df69 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -19,6 +19,12 @@ objective_types -= O if(!obj.randomgen) objective_types -= O + for(var/E in escape_objective_types) + var/datum/objective/obj = new E + if(M.special_role != obj.required_role && obj.required_role != null) + objective_types -= E + if(!obj.randomgen) + objective_types -= E for(var/i = 1, i <= objectives_made, i++) if(i == objectives_made && has_escape) var/datum/objective/holder_obj = pick(escape_objective_types) @@ -332,6 +338,7 @@ explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive." dangerrating = 25 martyr_compatible = 1 + randomgen = 0 /datum/objective/escape_obj/block/check_completion() if(!istype(owner.current, /mob/living/silicon)) @@ -385,6 +392,7 @@ dangerrating = 10 var/target_real_name // Has to be stored because the target's real_name can change over the course of the round var/target_missing_id + required_role = "changeling" /datum/objective/escape_obj/escape/escape_with_identity/find_target() target = ..() From 0121f6691f3bd0185b11a29f8c0b7f938eb8a4f6 Mon Sep 17 00:00:00 2001 From: AndrewJacksonThe2nd Date: Wed, 30 Dec 2015 13:14:28 -0800 Subject: [PATCH 12/12] fixes --- code/datums/mind.dm | 2 +- code/game/gamemodes/objective.dm | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index fd4db62865b..915bf455b66 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -623,7 +623,7 @@ var/datum/objective/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in (typesof(/datum/objective) - list(/datum/objective, /datum/objective/default, /datum/objective/escape_obj, /datum/objective/changeling_team_objective)) //keep out the abstract ones if (!new_obj_type) return - if (initial(new_obj_type.required_role) != special_role) + if (initial(new_obj_type.required_role) != special_role && initial(new_obj_type.required_role) != null) if(alert("The objective requires a special_role that this mind does not have. The player may not be able to complete the objective. Are you sure you want to continue?","uh oh" ,"Yes", "No") == "No") return diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 20fd2a4df69..073d828dc81 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -32,6 +32,7 @@ return else var/datum/objective/holder_obj = pick(objective_types) + objective_types -= holder_obj var/datum/objective/O = new holder_obj if(!O.martyr_compatible) escape_objective_types -= list(/datum/objective/escape_obj/martyr)