mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-09 16:14:13 +00:00
Tag mode : Changeling Clown Among Regular Mimes (#28601)
* Add (most) of the code for tag mode * Dynamic mode adjustements to make it work * Don't need that * They are no longer a mime * Forgot that
This commit is contained in:
@@ -307,6 +307,10 @@
|
||||
|
||||
#define isERT(H) (H.mind && H.mind.GetRole(RESPONDER))
|
||||
|
||||
#define isclownling(H) (H.mind && H.mind.GetRole(CLOWN_LING))
|
||||
|
||||
#define istagmime(H) (H.mind && H.mind.GetRole(TAG_MIME))
|
||||
|
||||
//Banning someone from the Syndicate role bans them from all antagonist roles
|
||||
#define isantagbanned(H) (jobban_isbanned(H, "Syndicate"))
|
||||
|
||||
|
||||
@@ -70,6 +70,8 @@
|
||||
#define STREAMER "streamer"
|
||||
#define XENOMORPH "alien"
|
||||
#define PRISONER "prisoner"
|
||||
#define CLOWN_LING "clown ling"
|
||||
#define TAG_MIME "tag mime"
|
||||
|
||||
#define GREET_DEFAULT "default"
|
||||
#define GREET_ROUNDSTART "roundstart"
|
||||
|
||||
@@ -640,3 +640,49 @@
|
||||
G.AssignToRole(M.mind,1)
|
||||
G.Greet(GREET_ROUNDSTART)
|
||||
return 1
|
||||
|
||||
//////////////////////////////////////////////
|
||||
// //
|
||||
// TAG MODE (speical) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// //
|
||||
//////////////////////////////////////////////
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/tag_mode
|
||||
name = "Tag mode"
|
||||
role_category = /datum/role/changeling/changeling_clown
|
||||
restricted_from_jobs = list()
|
||||
enemy_jobs = list()
|
||||
required_pop = list(0,0,0,0,0,0,0,0,0,0)
|
||||
required_candidates = 1
|
||||
weight = 10
|
||||
cost = 10
|
||||
requirements = list(101,101,101,101,101,101,101,101,101,101) // So that's not possible to roll it naturally
|
||||
high_population_requirement = 10
|
||||
flags = MINOR_RULESET
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/tag_mode/execute()
|
||||
|
||||
// Populate tagmode spawn list
|
||||
for(var/obj/effect/landmark/A in landmarks_list)
|
||||
if(A.name in valid_landmark_lists)
|
||||
tag_mode_spawns += get_turf(A)
|
||||
qdel(A)
|
||||
A = null
|
||||
continue
|
||||
|
||||
init_tag_mode_spawns()
|
||||
|
||||
// Spawn the clown...
|
||||
var/mob/M = pick(candidates)
|
||||
assigned += M
|
||||
candidates -= M
|
||||
var/datum/role/changeling/changeling_clown/clown = new
|
||||
clown.AssignToRole(M.mind,1)
|
||||
clown.Greet(GREET_ROUNDSTART)
|
||||
|
||||
// And everyone else as mimes.
|
||||
for (var/mob/M2 in (mode.get_ready_players() - M))
|
||||
var/datum/role/tag_mode_mime/mime = new
|
||||
mime.AssignToRole(M2.mind,1)
|
||||
mime.Greet(GREET_ROUNDSTART)
|
||||
return 1
|
||||
|
||||
@@ -252,6 +252,9 @@
|
||||
for(var/datum/faction/F in factions)
|
||||
if (F.check_win())
|
||||
return 1
|
||||
for(var/datum/role/R in orphaned_roles)
|
||||
if (R.check_win())
|
||||
return 1
|
||||
if(emergency_shuttle.location==2 || ticker.station_was_nuked)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -1,2 +1,5 @@
|
||||
/datum/objective/freeform/changeling
|
||||
explanation_text = "Varied adversity is required for adaptation and evolution. Create chaos and test the limits of your powers in unusual ways so that the Hive genome can grow toward perfection."
|
||||
|
||||
/datum/objective/freeform/changeling_clown
|
||||
explanation_text = "The scars of the clown-mime great war are still very present in your memories. You have managed to slip through, unnoticed, in this station of Mimes. The Honkmother has granted you unsual changeling powers to aid you on your task. Show them what true HONKing is."
|
||||
|
||||
@@ -12,3 +12,6 @@
|
||||
/datum/objective/survive/potions //You still get greentext if you survive
|
||||
explanation_text = "Sell some potions and make loads of money."
|
||||
name = "Sell potions"
|
||||
|
||||
/datum/objective/survive/tag_mode_mime
|
||||
explanation_text = "You are an ordinary Mime living in a space station. Your goal is to survive to the end of the shift... or become something more, if you dare."
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
..()
|
||||
wikiroute = role_wiki[BLOBOVERMIND]
|
||||
|
||||
/datum/role/blob_overmind/OnPostSetup()
|
||||
/datum/role/blob_overmind/OnPostSetup(var/laterole = FALSE)
|
||||
. = ..()
|
||||
AnnounceObjectives()
|
||||
|
||||
@@ -86,4 +86,4 @@
|
||||
to_chat(antag.current, "<span class='warning'>When you have found a location, wait until you spawn; this will happen automatically and you cannot speed up the process.</span>")
|
||||
to_chat(antag.current, "<span class='warning'>If you go outside of the station level, or in space, then you will die; make sure your location has lots of ground to cover.</span>")
|
||||
|
||||
to_chat(antag.current, "<span class='info'><a HREF='?src=\ref[antag.current];getwiki=[wikiroute]'>(Wiki Guide)</a></span>")
|
||||
to_chat(antag.current, "<span class='info'><a HREF='?src=\ref[antag.current];getwiki=[wikiroute]'>(Wiki Guide)</a></span>")
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
to_chat(antag.current, "<span class='danger'>The diseases you are carrying were added to your notes.</span>")
|
||||
|
||||
|
||||
/datum/role/catbeast/OnPostSetup()
|
||||
/datum/role/catbeast/OnPostSetup(var/laterole = FALSE)
|
||||
var/mob/living/carbon/human/H = antag.current
|
||||
H.set_species("Tajaran", force_organs=1)
|
||||
H.my_appearance.s_tone = CATBEASTBLACK
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
var/mimicing = ""
|
||||
|
||||
/datum/role/changeling/OnPostSetup()
|
||||
/datum/role/changeling/OnPostSetup(var/laterole = FALSE)
|
||||
. = ..()
|
||||
power_holder = new /datum/power_holder/changeling(src)
|
||||
antag.current.add_spell(new /spell/changeling/evolve, "changeling_spell_ready", /obj/abstract/screen/movable/spell_master/changeling )
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
..()
|
||||
wikiroute = role_wiki[CULTIST]
|
||||
|
||||
/datum/role/cultist/OnPostSetup()
|
||||
/datum/role/cultist/OnPostSetup(var/laterole = FALSE)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
var/obj/item/weapon/storage/backpack/holding/grinch/our_bag = null
|
||||
|
||||
// -- Transforms us into the devlish Grinch
|
||||
/datum/role/grinch/OnPostSetup()
|
||||
/datum/role/grinch/OnPostSetup(var/laterole = FALSE)
|
||||
. = ..()
|
||||
var/mob/old_mob = antag.current
|
||||
var/mob/living/simple_animal/hostile/gremlin/grinch/G = new
|
||||
@@ -50,4 +50,4 @@
|
||||
. += "<br/>"
|
||||
for (var/obj/item/I in get_contents_in_object(our_bag))
|
||||
bounty += shop_prices[I.type]
|
||||
. += "The Grinch managed to steal $[bounty] worth of items!<br/>"
|
||||
. += "The Grinch managed to steal $[bounty] worth of items!<br/>"
|
||||
|
||||
@@ -48,7 +48,7 @@ datum/role/madmonkey/Greet(var/greeting,var/custom)
|
||||
else //default
|
||||
to_chat(antag.current, "<img src='data:image/png;base64,[icon2base64(logo)]' style='position: relative; top: 10;'/> <span class='warning'><B>You are a [name]!</B><BR>Bite crewmembers to add to your ranks!</span>")
|
||||
|
||||
/datum/role/madmonkey/OnPostSetup()
|
||||
/datum/role/madmonkey/OnPostSetup(var/laterole = FALSE)
|
||||
if(faction)
|
||||
return
|
||||
var/datum/faction/F = find_active_faction_by_type(/datum/faction/junglefever)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
stat_datum_type = /datum/stat/role/ninja
|
||||
|
||||
/datum/role/ninja/OnPostSetup()
|
||||
/datum/role/ninja/OnPostSetup(var/laterole = FALSE)
|
||||
. =..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
AppendObjective(/datum/objective/escape_prisoner)
|
||||
AppendObjective(/datum/objective/minimize_casualties)
|
||||
|
||||
/datum/role/prisoner/OnPostSetup()
|
||||
/datum/role/prisoner/OnPostSetup(var/laterole = FALSE)
|
||||
..()
|
||||
//Make the prisoner
|
||||
var/mob/living/carbon/human/H = antag.current
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
wikiroute = ROLE_MINOR
|
||||
var/remaining_vows = 3
|
||||
|
||||
/datum/role/rambler/OnPostSetup()
|
||||
/datum/role/rambler/OnPostSetup(var/laterole = FALSE)
|
||||
. =..()
|
||||
if(ishuman(antag.current))
|
||||
equip_rambler(antag.current)
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
to_chat(antag.current, "<span class='info'><a HREF='?src=\ref[antag.current];getwiki=[wikiroute]'>(Wiki Guide)</a></span>")
|
||||
|
||||
/datum/role/revolutionary/OnPostSetup()
|
||||
/datum/role/revolutionary/OnPostSetup(var/laterole = FALSE)
|
||||
. = ..()
|
||||
AnnounceObjectives()
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
stat_datum_type = /datum/stat/role/revolutionary/leader
|
||||
|
||||
/datum/role/revolutionary/leader/OnPostSetup()
|
||||
/datum/role/revolutionary/leader/OnPostSetup(var/laterole = FALSE)
|
||||
.=..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
@@ -243,7 +243,7 @@
|
||||
P.grant_spell()
|
||||
|
||||
// Return 1 on success, 0 on failure.
|
||||
/datum/role/proc/OnPostSetup()
|
||||
/datum/role/proc/OnPostSetup(var/laterole = FALSE)
|
||||
return 1
|
||||
|
||||
/datum/role/proc/update_antag_hud()
|
||||
@@ -252,6 +252,9 @@
|
||||
/datum/role/proc/process()
|
||||
return
|
||||
|
||||
/datum/role/proc/check_win()
|
||||
return
|
||||
|
||||
// Create objectives here.
|
||||
/datum/role/proc/ForgeObjectives()
|
||||
return
|
||||
@@ -574,7 +577,7 @@
|
||||
/datum/role/highlander/ForgeObjectives()
|
||||
AppendObjective(/datum/objective/hijack)
|
||||
|
||||
/datum/role/highlander/OnPostSetup()
|
||||
/datum/role/highlander/OnPostSetup(var/laterole = FALSE)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
@@ -588,7 +591,7 @@
|
||||
required_pref = MALF
|
||||
logo_state = "malf-logo"
|
||||
|
||||
/datum/role/malfAI/OnPostSetup()
|
||||
/datum/role/malfAI/OnPostSetup(var/laterole = FALSE)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
@@ -620,7 +623,7 @@ Once done, you will be able to interface with all systems, notably the onboard n
|
||||
required_jobs = list("Cyborg")
|
||||
logo_state = "malf-logo"
|
||||
|
||||
/datum/role/malfbot/OnPostSetup()
|
||||
/datum/role/malfbot/OnPostSetup(var/laterole = FALSE)
|
||||
if(!isrobot(antag.current))
|
||||
return FALSE
|
||||
Greet()
|
||||
@@ -683,4 +686,4 @@ Once done, you will be able to interface with all systems, notably the onboard n
|
||||
dat += "<br/>The greytide leader's former slaves were: <br/>"
|
||||
for (var/ckey in former_minions)
|
||||
dat += "<img src='data:image/png;base64,[icon2base64(logo_slave)]' style='position: relative; top: 10;'/> <b>[ckey]</b> as <b>[former_minions[ckey]]</b><br/>"
|
||||
return jointext(dat, "")
|
||||
return jointext(dat, "")
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
to_chat(antag.current, "Entertain your audience to obtain followers and subscribers!")
|
||||
antag.current << sound('sound/machines/lawsync.ogg')
|
||||
|
||||
/datum/role/streamer/OnPostSetup()
|
||||
/datum/role/streamer/OnPostSetup(var/laterole = FALSE)
|
||||
. = ..()
|
||||
update_streamer_hud()
|
||||
ForgeObjectives()
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
/datum/role/wizard/summon_magic/Greet()
|
||||
to_chat(antag.current, "<B>You are a Magician!</B><BR>Your own safety matters above all else, trust no one and kill anyone who gets in your way. However, armed as you are, now would be the perfect time to settle that score or grab that pair of yellow gloves you've been eyeing...")
|
||||
|
||||
/datum/role/wizard/summon_magic/OnPostSetup()
|
||||
/datum/role/wizard/summon_magic/OnPostSetup(var/laterole = FALSE)
|
||||
return TRUE
|
||||
|
||||
/datum/role/wizard/summon_magic/GetScoreboard()
|
||||
@@ -70,9 +70,9 @@
|
||||
/datum/role/wizard/summon_potions/Greet()
|
||||
to_chat(antag.current, "<B>You are a Potion Seller!</B><BR>Your own safety matters abov- Fuck that, GO SELL SOME POTIONS!")
|
||||
|
||||
/datum/role/wizard/summon_potions/OnPostSetup()
|
||||
/datum/role/wizard/summon_potions/OnPostSetup(var/laterole = FALSE)
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/role/wizard/summon_potions/GetScoreboard()
|
||||
. = ..()
|
||||
. += "The [name] received the following as a result of a summoning spell: [summons_received]<BR>"
|
||||
|
||||
142
code/datums/gamemode/role/tag_mode.dm
Normal file
142
code/datums/gamemode/role/tag_mode.dm
Normal file
@@ -0,0 +1,142 @@
|
||||
// -- Civvie landmarks.
|
||||
var/list/valid_landmark_lists = list("Mime", "Clown", "Bartender", "Chef", "Botanist", "Assistant", "Librarian", "Chaplain")
|
||||
var/list/turf/tag_mode_spawns = list()
|
||||
var/list/tag_mode_non_used_spawns = list()
|
||||
|
||||
/proc/init_tag_mode_spawns()
|
||||
if (tag_mode_spawns.len == 0)
|
||||
CRASH("tag mode spawn list not initialised")
|
||||
for (var/i = 1 to tag_mode_spawns.len)
|
||||
tag_mode_non_used_spawns.Add(i)
|
||||
|
||||
// -- Clown ling
|
||||
|
||||
/datum/controller/gameticker
|
||||
var/tag_mode_ling_iterations = 0
|
||||
|
||||
/datum/role/changeling/changeling_clown
|
||||
name = "Changeling Clown"
|
||||
disallow_job = TRUE
|
||||
id = CLOWN_LING
|
||||
|
||||
/datum/role/changeling/changeling_clown/OnPostSetup(var/laterole = FALSE)
|
||||
// Spawn them
|
||||
if (!laterole)
|
||||
|
||||
var/index = pick(tag_mode_non_used_spawns)
|
||||
antag.current.forceMove(tag_mode_spawns[index])
|
||||
tag_mode_non_used_spawns -= index
|
||||
|
||||
// Give them the outfit
|
||||
var/datum/outfit/mime/clown_ling/concrete_outfit = new
|
||||
concrete_outfit.items_to_collect[/obj/item/weapon/card/id/captains_spare] = SURVIVAL_BOX // Everyone gets a spare in tagmode.
|
||||
concrete_outfit.equip(antag.current)
|
||||
|
||||
// Give them the changeling powers
|
||||
. = ..()
|
||||
// Objective
|
||||
ForgeObjectives()
|
||||
|
||||
// Make their mask special and liked to them
|
||||
ticker.tag_mode_ling_iterations++
|
||||
var/list/gas_mask = recursive_type_check(antag.current, /obj/item/clothing/mask/gas/clown_hat/ling_mask) // (a bit ugly but I don't see how else to do it)
|
||||
for (var/obj/item/clothing/mask/gas/clown_hat/ling_mask/LM in gas_mask)
|
||||
LM.our_ling = src
|
||||
|
||||
/datum/role/changeling/changeling_clown/ForgeObjectives()
|
||||
AppendObjective(/datum/objective/freeform/changeling_clown)
|
||||
|
||||
/datum/role/changeling/changeling_clown/Greet(var/greeting,var/custom)
|
||||
if(!greeting)
|
||||
return
|
||||
|
||||
var/icon/logo = icon('icons/logos.dmi', logo_state)
|
||||
|
||||
switch (greeting)
|
||||
if (GREET_ROUNDSTART)
|
||||
to_chat(antag.current, "<img src='data:image/png;base64,[icon2base64(logo)]' style='position: relative; top: 10;'/> <span class='danger'>You are a Changeling Clown.</span>")
|
||||
to_chat(antag.current, "<span class='danger'>You are inflitrated among the Mimes of the station. Your objective is to take them out. Be careful, as you are alone and with no backup.</span>")
|
||||
to_chat(antag.current, "<span class='info'><a HREF='?src=\ref[antag.current];getwiki=[wikiroute]'>(Wiki Guide)</a></span>")
|
||||
|
||||
if (GREET_LATEJOIN)
|
||||
to_chat(antag.current, "<img src='data:image/png;base64,[icon2base64(logo)]' style='position: relative; top: 10;'/> <span class='danger'>You have become Changeling Clown.</span>")
|
||||
to_chat(antag.current, "<span class='danger'>By equipping the mask of the clown, you have lost your Mime-minity and you must now continue their work. Wipe out the remaning mimes from the station.</span>")
|
||||
to_chat(antag.current, "<span class='info'><a HREF='?src=\ref[antag.current];getwiki=[wikiroute]'>(Wiki Guide)</a></span>")
|
||||
|
||||
AnnounceObjectives()
|
||||
antag.current << sound('sound/effects/ling_intro.ogg')
|
||||
|
||||
/datum/role/changeling/changeling_clown/check_win()
|
||||
for(var/datum/role/tag_mode_mime/R in ticker.mode.orphaned_roles)
|
||||
if (!R.antag.current.stat) // alive
|
||||
return FALSE
|
||||
|
||||
to_chat(world, "<h2>The changeling clown has won!</h2>")
|
||||
to_chat(world, "<span class='notice'>All mimes are dead. The changeling clown was [antag.key], with [ticker.tag_mode_ling_iterations] changes from the original clown changeling.</span>")
|
||||
return TRUE
|
||||
|
||||
// -- Clown cursed mask item
|
||||
|
||||
/obj/item/clothing/mask/gas/clown_hat/ling_mask
|
||||
var/datum/role/changeling/changeling_clown/our_ling
|
||||
|
||||
/obj/item/clothing/mask/gas/clown_hat/ling_mask/equipped(var/mob/user, var/slot, hand_index = 0)
|
||||
. = ..()
|
||||
if (slot == slot_wear_mask)
|
||||
if (our_ling.antag.current.stat && istagmime(user)) // Our ling is dead...
|
||||
our_ling.Drop()
|
||||
var/datum/role/tag_mode_mime = user.mind.GetRole(TAG_MIME)
|
||||
tag_mode_mime.Drop()
|
||||
user.mind.miming = 0
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
for(var/spell/aoe_turf/conjure/forcewall/mime/spell in H.spell_list)
|
||||
user.remove_spell(spell)
|
||||
for(var/spell/targeted/oathbreak/spell in H.spell_list)
|
||||
user.remove_spell(spell)
|
||||
|
||||
// Long live the new ling
|
||||
var/datum/role/changeling/changeling_clown/CC = new
|
||||
CC.AssignToRole(user.mind, 1)
|
||||
CC.OnPostSetup(TRUE)
|
||||
CC.Greet(GREET_LATEJOIN)
|
||||
our_ling = CC
|
||||
|
||||
// -- Mimes
|
||||
|
||||
var/spawned_mimes_tag_mode = 1
|
||||
|
||||
/datum/role/tag_mode_mime
|
||||
name = "Mime"
|
||||
disallow_job = TRUE
|
||||
id = TAG_MIME
|
||||
|
||||
/datum/role/tag_mode_mime/OnPostSetup(var/laterole = FALSE)
|
||||
// Spawn them
|
||||
if (tag_mode_non_used_spawns.len == 0)
|
||||
init_tag_mode_spawns()
|
||||
|
||||
if (!laterole)
|
||||
var/index = pick(tag_mode_non_used_spawns)
|
||||
antag.current.forceMove(tag_mode_spawns[index])
|
||||
tag_mode_non_used_spawns -= index
|
||||
|
||||
// Give them the outfit
|
||||
var/datum/outfit/mime/concrete_outfit = new
|
||||
concrete_outfit.items_to_collect[/obj/item/weapon/card/id/captains_spare] = SURVIVAL_BOX // Everyone gets a spare in tagmode.
|
||||
concrete_outfit.equip(antag.current)
|
||||
|
||||
// Objective
|
||||
ForgeObjectives()
|
||||
|
||||
/datum/role/tag_mode_mime/ForgeObjectives()
|
||||
AppendObjective(/datum/objective/survive/tag_mode_mime)
|
||||
|
||||
/datum/role/tag_mode_mime/Greet(var/greeting,var/custom)
|
||||
if(!greeting)
|
||||
return
|
||||
|
||||
switch (greeting)
|
||||
if (GREET_ROUNDSTART)
|
||||
to_chat(antag.current, "<span class='notice'><big>You are a Mime.</big></span>")
|
||||
to_chat(antag.current, "<span class='notice'>You are an ordinary mime. Your objective is to find the clown infiltred among the crew and steal his mask to gain his power - or to simply survive.</span>")
|
||||
@@ -284,7 +284,7 @@
|
||||
if (joined)
|
||||
joined.HandleRecruitedRole(newRole)
|
||||
|
||||
newRole.OnPostSetup(FALSE)
|
||||
newRole.OnPostSetup()
|
||||
if ((chosen_greeting && chosen_greeting != "custom") || (chosen_greeting == "custom" && custom_greeting))
|
||||
newRole.Greet(chosen_greeting,custom_greeting)
|
||||
|
||||
|
||||
@@ -420,16 +420,30 @@
|
||||
|
||||
/datum/outfit/mime/post_equip(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
H.add_spell(new /spell/aoe_turf/conjure/forcewall/mime, "grey_spell_ready")
|
||||
H.add_spell(new /spell/targeted/oathbreak/)
|
||||
mob_rename_self(H,"mime")
|
||||
if (H.mind)
|
||||
H.mind.miming = MIMING_OUT_OF_CHOICE
|
||||
if (type == /datum/outfit/mime) // A bit hacky but post_equip should always call its parent.
|
||||
H.add_spell(new /spell/aoe_turf/conjure/forcewall/mime, "grey_spell_ready")
|
||||
H.add_spell(new /spell/targeted/oathbreak/)
|
||||
mob_rename_self(H,"mime")
|
||||
if (H.mind)
|
||||
H.mind.miming = MIMING_OUT_OF_CHOICE
|
||||
|
||||
/datum/outfit/mime/post_equip_priority(var/mob/living/carbon/human/H)
|
||||
items_to_collect[/obj/item/weapon/coin/clown] = SURVIVAL_BOX
|
||||
return ..()
|
||||
|
||||
// -- Clown ling (aka fake mime)
|
||||
/datum/outfit/mime/clown_ling
|
||||
items_to_collect = list(
|
||||
/obj/item/weapon/bikehorn = null,
|
||||
/obj/item/weapon/stamp/clown = null,
|
||||
/obj/item/clothing/under/rank/clown = null,
|
||||
/obj/item/clothing/mask/gas/clown_hat/ling_mask = null,
|
||||
)
|
||||
|
||||
/datum/outfit/mime/clown_ling/post_equip(var/mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
mob_rename_self(H,"clown")
|
||||
|
||||
// -- Janitor
|
||||
|
||||
/datum/outfit/janitor
|
||||
|
||||
@@ -46,6 +46,9 @@ var/datum/controller/gameticker/ticker
|
||||
// Hack
|
||||
var/obj/machinery/media/jukebox/superjuke/thematic/theme = null
|
||||
|
||||
// Tag mode!
|
||||
var/tag_mode_enabled = FALSE
|
||||
|
||||
#define LOBBY_TICKING 1
|
||||
#define LOBBY_TICKING_RESTARTED 2
|
||||
/datum/controller/gameticker/proc/pregame()
|
||||
@@ -733,6 +736,27 @@ var/datum/controller/gameticker/ticker
|
||||
to_chat(R, R.connected_ai?"<b>You have synchronized with an AI. Their name will be stated shortly. Other AIs can be ignored.</b>":"<b>You are not synchronized with an AI, and therefore are not required to heed the instructions of any unless you are synced to them.</b>")
|
||||
R.lawsync()
|
||||
|
||||
// -- Tag mode!
|
||||
|
||||
/datum/controller/gameticker/proc/tag_mode(var/mob/user)
|
||||
tag_mode_enabled = TRUE
|
||||
to_chat(world, "<h1>Tag mode enabled!<h1>")
|
||||
to_chat(world, "<span class='notice'>Tag mode is a 'gamemode' about a changeling clown infiltrated in a station populated by Mimes. His goal is to destroy it. Any mime killing the clown will in turn become the changeling.</span>")
|
||||
to_chat(world, "<span class='notice'>The game ends when all mimes are dead, or when the shuttle is called.</span>")
|
||||
to_chat(world, "<span class='notice'>Have fun!</span>")
|
||||
|
||||
// This is /datum/forced_ruleset thing. This shit exists ONLY for pre-roundstart rulesets. Yes. This is a thing.
|
||||
var/datum/forced_ruleset/tag_mode = new
|
||||
tag_mode.name = "Tag mode"
|
||||
tag_mode.calledBy = "[key_name(user)]"
|
||||
forced_roundstart_ruleset += tag_mode
|
||||
dynamic_forced_extended = TRUE
|
||||
|
||||
/datum/controller/gameticker/proc/cancel_tag_mode(var/mob/user)
|
||||
tag_mode_enabled = FALSE
|
||||
to_chat(world, "<h1>Tag mode has been cancelled.<h1>")
|
||||
dynamic_forced_extended = FALSE
|
||||
forced_roundstart_ruleset = list()
|
||||
|
||||
/world/proc/has_round_started()
|
||||
return ticker && ticker.current_state >= GAME_STATE_PLAYING
|
||||
|
||||
@@ -713,6 +713,7 @@ var/global/floorIsLava = 0
|
||||
<A href='?src=\ref[src];xgm_panel=1'>XGM Panel</A><br>
|
||||
<A href='?src=\ref[src];toggle_light=1'>Slow down lighting (Forces MC to crash, do not panic.)</A><br>
|
||||
<hr />
|
||||
<A href='?src=\ref[src];tag_mode=1'>Toggle tag mode! (it is currently [ticker?.tag_mode_enabled ? "On" : "Off"])</A><br>
|
||||
"}
|
||||
|
||||
if(wages_enabled)
|
||||
|
||||
@@ -5674,6 +5674,13 @@
|
||||
|
||||
mass_delete_in_zone() // Refreshes the window
|
||||
|
||||
else if(href_list["tag_mode"])
|
||||
if (!check_rights(R_FUN))
|
||||
to_chat(usr, "You don't have the necessary permissions to do this.")
|
||||
return
|
||||
else
|
||||
toggle_tag_mode(usr)
|
||||
|
||||
/datum/admins/proc/updateRelWindow()
|
||||
var/text = list()
|
||||
text += "<h3>Religions in game</h3>"
|
||||
|
||||
17
code/modules/admin/verbs/tagmode.dm
Normal file
17
code/modules/admin/verbs/tagmode.dm
Normal file
@@ -0,0 +1,17 @@
|
||||
/datum/admins/proc/toggle_tag_mode(var/mob/user)
|
||||
if (!check_rights(R_FUN))
|
||||
to_chat(user, "<span class='notice'>You need +FUN to do this.</span>")
|
||||
return
|
||||
|
||||
if (ticker.tag_mode_enabled)
|
||||
var/confirm_cancel = alert(user, "Do you wish to cancel tag mode?", "Tag mode!", "Yes", "No")
|
||||
if (confirm_cancel == "Yes")
|
||||
message_admins("[key_name(user)] has cancelled tag mode.")
|
||||
log_admin("[key_name(user)] has cancelled tag mode.")
|
||||
ticker.cancel_tag_mode(user)
|
||||
else
|
||||
var/confirm = alert(user, "Do you wish to enable tag mode? All players spawn as mimes, one as a disguised clown changeling. Killing the clown changeling will grant its powers to its killer.", "Tag mode!", "Yes", "No")
|
||||
if (confirm == "Yes")
|
||||
message_admins("[key_name(user)] has cancelled tag mode.")
|
||||
log_admin("[key_name(user)] has cancelled tag mode.")
|
||||
ticker.tag_mode(user)
|
||||
@@ -385,6 +385,15 @@
|
||||
if(character.client.prefs.randomslot)
|
||||
character.client.prefs.random_character_sqlite(character, character.ckey)
|
||||
|
||||
// Very hacky. Sorry about that
|
||||
if(ticker.tag_mode_enabled == TRUE)
|
||||
character.mind.assigned_role = "MODE"
|
||||
var/datum/outfit/mime/mime_outfit = new
|
||||
mime_outfit.equip(character)
|
||||
var/datum/role/tag_mode_mime/mime = new
|
||||
mime.AssignToRole(character.mind,1)
|
||||
mime.Greet(GREET_ROUNDSTART)
|
||||
|
||||
if(character.mind.assigned_role != "MODE")
|
||||
job_master.EquipRank(character, rank, 1) //Must come before OnPostSetup for uplinks
|
||||
|
||||
@@ -393,7 +402,7 @@
|
||||
var/turf/T = character.loc
|
||||
for(var/role in character.mind.antag_roles)
|
||||
var/datum/role/R = character.mind.antag_roles[role]
|
||||
R.OnPostSetup()
|
||||
R.OnPostSetup(TRUE) // Latejoiner post-setup.
|
||||
R.ForgeObjectives()
|
||||
R.AnnounceObjectives()
|
||||
|
||||
@@ -418,7 +427,7 @@
|
||||
character.store_position()
|
||||
|
||||
// WHY THE FUCK IS THIS HERE
|
||||
// FOR GOD'S SAKE USE EVENTS TODO: use latejoin dynamic rulesets to deal with that
|
||||
// FOR GOD'S SAKE USE EVENTS TODO: use latejoin dynamic rulesets to deal with that // (they did not do that)
|
||||
if(bomberman_mode)
|
||||
character.client << sound('sound/bomberman/start.ogg')
|
||||
if(character.wear_suit)
|
||||
|
||||
@@ -462,6 +462,7 @@
|
||||
#include "code\datums\gamemode\role\streamer.dm"
|
||||
#include "code\datums\gamemode\role\summonsurvivors.dm"
|
||||
#include "code\datums\gamemode\role\syndicate.dm"
|
||||
#include "code\datums\gamemode\role\tag_mode.dm"
|
||||
#include "code\datums\gamemode\role\vampire_role.dm"
|
||||
#include "code\datums\gamemode\role\vox_raider.dm"
|
||||
#include "code\datums\gamemode\role\wizard.dm"
|
||||
@@ -1320,6 +1321,7 @@
|
||||
#include "code\modules\admin\verbs\profiling.dm"
|
||||
#include "code\modules\admin\verbs\randomverbs.dm"
|
||||
#include "code\modules\admin\verbs\striketeam.dm"
|
||||
#include "code\modules\admin\verbs\tagmode.dm"
|
||||
#include "code\modules\admin\verbs\ticklag.dm"
|
||||
#include "code\modules\admin\verbs\tripAI.dm"
|
||||
#include "code\modules\admin\verbs\SDQL_2\SDQL_2.dm"
|
||||
|
||||
Reference in New Issue
Block a user