From 4dc00e99f27ee881c793c3ea4567d524fbb95fbc Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Mon, 7 Nov 2016 17:01:35 -0600 Subject: [PATCH] Multiverse Revival (now with huds!) (#19778) * Multiverse Revival * Slightly less awful code * Makes code cleaner, fixes stun issue on spawn * Replaces usr with user in the multiverse sword + allows it to dismember * Prevents gang related messages displaying for multiverse clones --- code/game/gamemodes/gang/gang.dm | 29 +++++----- code/game/gamemodes/gang/gang_datum.dm | 18 ++++++- code/game/gamemodes/wizard/artefact.dm | 71 ++++++++----------------- code/game/gamemodes/wizard/spellbook.dm | 20 +++++++ code/modules/admin/verbs/onlyone.dm | 6 +++ 5 files changed, 83 insertions(+), 61 deletions(-) diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index c5336b84239..683ee085a48 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -168,13 +168,15 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple" carbon_mob.silent = max(carbon_mob.silent, 5) carbon_mob.flash_act(1, 1) gangster_mind.current.Stun(5) - gangster_mind.current << "You are now a member of the [G.name] Gang!" - gangster_mind.current << "Help your bosses take over the station by claiming territory with special spraycans only they can provide. Simply spray on any unclaimed area of the station." - gangster_mind.current << "Their ultimate objective is to take over the station with a Dominator machine." - gangster_mind.current << "You can identify your bosses by their large, bright [G.color] \[G\] icon." + if(G.is_deconvertible) + gangster_mind.current << "You are now a member of the [G.name] Gang!" + gangster_mind.current << "Help your bosses take over the station by claiming territory with special spraycans only they can provide. Simply spray on any unclaimed area of the station." + gangster_mind.current << "Their ultimate objective is to take over the station with a Dominator machine." + gangster_mind.current << "You can identify your bosses by their large, bright [G.color] \[G\] icon." + gangster_mind.store_memory("You are a member of the [G.name] Gang!") gangster_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the [G.name] Gang!" gangster_mind.special_role = "[G.name] Gangster" - gangster_mind.store_memory("You are a member of the [G.name] Gang!") + G.add_gang_hud(gangster_mind) if(jobban_isbanned(gangster_mind.current, ROLE_GANG)) addtimer(src, "replace_jobbaned_player", 0, FALSE, gangster_mind.current, ROLE_GANG, ROLE_GANG) @@ -190,6 +192,8 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple" var/removed for(var/datum/gang/G in gangs) + if(!G.is_deconvertible && !remove_bosses) + return 0 if(gangster_mind in G.gangsters) G.gangsters -= gangster_mind removed = 1 @@ -251,13 +255,14 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple" ////////////////////////////////////////////////////////////////////// /datum/game_mode/proc/auto_declare_completion_gang(datum/gang/winner) - if(gangs.len) - if(!winner) - world << "The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]
" - feedback_set_details("round_end_result","loss - gangs failed takeover") - else - world << "The [winner.name] Gang successfully performed a hostile takeover of the station!
" - feedback_set_details("round_end_result","win - gang domination complete") + if(!gangs.len) + return + if(!winner) + world << "The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]
" + feedback_set_details("round_end_result","loss - gangs failed takeover") + else + world << "The [winner.name] Gang successfully performed a hostile takeover of the station!
" + feedback_set_details("round_end_result","win - gang domination complete") for(var/datum/gang/G in gangs) var/text = "The [G.name] Gang was [winner==G ? "victorious" : "defeated"] with [round((G.territory.len/start_state.num_territories)*100, 1)]% control of the station!" diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm index b78e961c9ad..7c443d1c14b 100644 --- a/code/game/gamemodes/gang/gang_datum.dm +++ b/code/game/gamemodes/gang/gang_datum.dm @@ -16,6 +16,7 @@ var/dom_attempts = 2 var/points = 15 var/datum/atom_hud/antag/gang/ganghud + var/is_deconvertible = TRUE //Can you deconvert normal gangsters from the gang var/domination_timer var/is_dominating @@ -135,7 +136,6 @@ /datum/gang/proc/income() if(!bosses.len) return - var/added_names = "" var/lost_names = "" @@ -214,3 +214,19 @@ //Increase outfit stock for(var/obj/item/device/gangtool/tool in gangtools) tool.outfits = min(tool.outfits+1,5) + + +//Multiverse + +/datum/gang/multiverse + dom_attempts = 0 + points = 0 + fighting_style = "multiverse" + is_deconvertible = FALSE + +/datum/gang/multiverse/New(loc, multiverse_override) + name = multiverse_override + ganghud = new() + +/datum/gang/multiverse/income() + return \ No newline at end of file diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 2d998b9c1e3..130579b3cb0 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -208,14 +208,14 @@ var/global/list/multiverse = list() hitsound = 'sound/weapons/bladeslice.ogg' flags = CONDUCT slot_flags = SLOT_BELT + sharpness = IS_SHARP force = 20 throwforce = 10 - w_class = 2 + w_class = 3 attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") var/faction = list("unassigned") var/cooldown = 0 var/assigned = "unassigned" - var/evil = TRUE /obj/item/weapon/multisword/New() ..() @@ -241,27 +241,20 @@ var/global/list/multiverse = list() assigned = "[user.real_name]" user.faction = list("[user.real_name]") user << "You bind the sword to yourself. You can now use it to summon help." - if(!usr.mind.special_role) - if(prob(30)) - user << "With your new found power you could easily conquer the station!" - var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone - hijack_objective.owner = usr.mind - usr.mind.objectives += hijack_objective - hijack_objective.explanation_text = "Ensure only [usr.real_name] and their copies are on the shuttle!" - usr << "Objective #[1]: [hijack_objective.explanation_text]" - ticker.mode.traitors += usr.mind - usr.mind.special_role = "[usr.real_name] Prime" - evil = TRUE - else - user << "With your new found power you could easily defend the station!" - var/datum/objective/survive/new_objective = new /datum/objective/survive - new_objective.owner = usr.mind - new_objective.explanation_text = "Survive, and help defend the innocent from the mobs of multiverse clones." - usr << "Objective #[1]: [new_objective.explanation_text]" - usr.mind.objectives += new_objective - ticker.mode.traitors += usr.mind - usr.mind.special_role = "[usr.real_name] Prime" - evil = FALSE + if(!is_gangster(user)) + var/datum/gang/multiverse/G = new(src, "[user.real_name]") + ticker.mode.gangs += G + G.bosses += user.mind + G.add_gang_hud(user.mind) + user.mind.gang_datum = G + user << "With your new found power you could easily conquer the station!" + var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone + hijack_objective.owner = user.mind + user.mind.objectives += hijack_objective + hijack_objective.explanation_text = "Ensure only [user.real_name] and their copies are on the shuttle!" + user << "Objective #[1]: [hijack_objective.explanation_text]" + ticker.mode.traitors += user.mind + user.mind.special_role = "[user.real_name] Prime" else var/list/candidates = get_candidates(ROLE_WIZARD) if(candidates.len) @@ -279,15 +272,16 @@ var/global/list/multiverse = list() user << "[src] is recharging! Keep in mind it shares a cooldown with the swords wielded by your copies." -/obj/item/weapon/multisword/proc/spawn_copy(var/client/C, var/turf/T) +/obj/item/weapon/multisword/proc/spawn_copy(var/client/C, var/turf/T, mob/user) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) C.prefs.copy_to(M, icon_updates=0) M.key = C.key - M.mind.name = usr.real_name - M << "You are an alternate version of [usr.real_name] from another universe! Help them accomplish their goals at all costs." - M.real_name = usr.real_name - M.name = usr.real_name - M.faction = list("[usr.real_name]") + M.mind.name = user.real_name + M << "You are an alternate version of [user.real_name] from another universe! Help them accomplish their goals at all costs." + ticker.mode.add_gangster(M.mind, user.mind.gang_datum, FALSE) + M.real_name = user.real_name + M.name = user.real_name + M.faction = list("[user.real_name]") if(prob(50)) var/list/all_species = list() for(var/speciestype in subtypesof(/datum/species)) @@ -301,30 +295,11 @@ var/global/list/multiverse = list() M.dna.update_dna_identity() equip_copy(M) - if(evil) - var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone - hijack_objective.owner = M.mind - M.mind.objectives += hijack_objective - hijack_objective.explanation_text = "Ensure only [usr.real_name] and their copies are on the shuttle!" - M << "Objective #[1]: [hijack_objective.explanation_text]" - M.mind.special_role = "multiverse traveller" - log_game("[M.key] was made a multiverse traveller with the objective to help [usr.real_name] hijack.") - else - var/datum/objective/protect/new_objective = new /datum/objective/protect - new_objective.owner = M.mind - new_objective.target = usr.mind - new_objective.explanation_text = "Protect [usr.real_name], your copy, and help them defend the innocent from the mobs of multiverse clones." - M.mind.objectives += new_objective - M << "Objective #[1]: [new_objective.explanation_text]" - M.mind.special_role = "multiverse traveller" - log_game("[M.key] was made a multiverse traveller with the objective to help [usr.real_name] protect the station.") - /obj/item/weapon/multisword/proc/equip_copy(var/mob/living/carbon/human/M) var/obj/item/weapon/multisword/sword = new /obj/item/weapon/multisword sword.assigned = assigned sword.faction = list("[assigned]") - sword.evil = evil var/randomize = pick("mobster","roman","wizard","cyborg","syndicate","assistant", "animu", "cultist", "highlander", "clown", "killer", "pirate", "soviet", "officer", "gladiator") diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index a5cd1b7d5b5..1314301b3be 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -469,6 +469,26 @@ return 0 return (ticker.mode.name != "ragin' mages" && !config.no_summon_magic) +/datum/spellbook_entry/summon/multisword + name = "Multiverse War" + category = "Rituals" + desc = "Triggers a multiverse war in which the crew (and you) must summon copies of yourself from alternate realities to do battle and hijack the emergency shuttle. Automatically triggers a shuttle call on purchase." + log_name = "MW" + cost = 8 + +/datum/spellbook_entry/summon/multisword/IsAvailible() + if(!ticker.mode) // In case spellbook is placed on map + return 0 + return (ticker.mode.name != "ragin' mages" && !config.no_summon_magic) + +/datum/spellbook_entry/summon/multisword/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) + feedback_add_details("wizard_spell_learned",log_name) + only_me() + new /obj/item/weapon/multisword(get_turf(user)) //Because the proc skips special roles + SSshuttle.emergency.request() + playsound(get_turf(user),"sound/magic/CastSummon.ogg",50,1) + user << "You have triggerd a multiverse war!" + /datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) feedback_add_details("wizard_spell_learned",log_name) rightandwrong(1, user, 25) diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index 5312c41b33c..d6a6950a68e 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -92,6 +92,12 @@ var/highlander = FALSE H << "You are the multiverse summoner. Activate your blade to summon copies of yourself from another universe to fight by your side." H.mind.announce_objectives() + var/datum/gang/multiverse/G = new(src, "[H.real_name]") + ticker.mode.gangs += G + G.bosses += H.mind + G.add_gang_hud(H.mind) + H.mind.gang_datum = G + var/obj/item/slot_item_ID = H.get_item_by_slot(slot_wear_id) qdel(slot_item_ID) var/obj/item/slot_item_hand = H.get_item_for_held_index(2)