diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm
index 5797e36f5ce..3ec883325e6 100644
--- a/code/__HELPERS/names.dm
+++ b/code/__HELPERS/names.dm
@@ -17,7 +17,13 @@ GLOBAL_VAR(church_name)
GLOBAL_VAR(command_name)
/proc/command_name()
- return SSmapping.map_datum.dock_name
+ return GLOB.command_name? GLOB.command_name : SSmapping.map_datum.dock_name
+
+/proc/change_command_name(name)
+
+ GLOB.command_name = name
+
+ return name
GLOBAL_VAR(religion_name)
/proc/religion_name()
@@ -34,8 +40,19 @@ GLOBAL_VAR(religion_name)
/proc/system_name()
return SSmapping.map_datum.starsys_name
+GLOBAL_VAR(station_name)
/proc/station_name()
- return SSmapping.map_datum.station_name
+ return GLOB.station_name? GLOB.station_name : SSmapping.map_datum.station_name
+
+/proc/change_station_name(designation)
+ GLOB.station_name = designation
+ update_world_name()
+
+/proc/update_world_name()
+ if(config && CONFIG_GET(string/servername))
+ world.name = "[CONFIG_GET(string/servername)] — [station_name()]"
+ else
+ world.name = station_name()
/proc/new_station_name()
var/random = rand(1,5)
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index d91584ba51a..50ac31c5c6a 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -215,13 +215,12 @@ SUBSYSTEM_DEF(mapping)
existing_station_areas += AR
// World name
- if(config && CONFIG_GET(string/servername))
- world.name = "[CONFIG_GET(string/servername)] — [station_name()]"
- else
- world.name = station_name()
+ GLOB.station_name = station_name()
+ update_world_name()
return SS_INIT_SUCCESS
+
/datum/controller/subsystem/mapping/fire(resumed)
// Cache for sonic speed
var/list/unused_turfs = src.unused_turfs
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 4b2d6b9d206..a4b91cbcec2 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -367,6 +367,8 @@ GLOBAL_VAR_INIT(nologevent, 0)
dat += "
Quick Create Object
"
dat += "Create Turf
"
dat += "Create Mob
"
+ if(marked_datum && istype(marked_datum, /atom))
+ dat += "Duplicate Marked Datum
"
var/datum/browser/popup = new(usr, "game_panel", "Game Panel
", 210, 280)
popup.set_content(dat.Join(""))
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 22d6f7a2d3a..629a8a4a81e 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -110,6 +110,7 @@ GLOBAL_LIST_INIT(admin_verbs_event, list(
/client/proc/response_team, // Response Teams admin verb
/client/proc/cmd_admin_create_centcom_report,
/client/proc/event_manager_panel,
+ /client/proc/forceEvent,
/client/proc/modify_goals,
/client/proc/outfit_manager,
/client/proc/cmd_admin_headset_message,
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 36a707950a6..c31df525893 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -374,6 +374,39 @@
dat += span_danger("Emergency shuttle lockdowned")
dat += "
Stop lockdown
"
dat += "[SSticker.delay_end ? "End Round Normally" : "Delay Round End"]
"
+ var/connected_players = GLOB.clients.len
+ var/lobby_players = 0
+ var/observers = 0
+ var/observers_connected = 0
+ var/living_players = 0
+ var/living_players_connected = 0
+ var/living_players_antagonist = 0
+ var/other_players = 0
+ for(var/mob/M in GLOB.mob_list)
+ if(M.ckey)
+ if(isnewplayer(M))
+ lobby_players++
+ continue
+ else if(M.stat != DEAD && M.mind && !isbrain(M))
+ living_players++
+ if(M.mind.special_role)
+ living_players_antagonist++
+ if(M.client)
+ living_players_connected++
+ else if((M.stat == DEAD )||(isobserver(M)))
+ observers++
+ if(M.client)
+ observers_connected++
+ else
+ other_players += M
+ dat += "
Players:|[connected_players - lobby_players] ingame|[connected_players] connected|[lobby_players] lobby|"
+ dat += "
Living Players:|[living_players_connected] active|[living_players - living_players_connected] disconnected|[living_players_antagonist] antagonists|"
+ dat += "
Dead/Observing players:|[observers_connected] active|[observers - observers_connected] disconnected|"
+ if(other_players)
+ dat += "
[other_players] players in invalid state or the statistics code is bugged!"
+ dat += "
"
+ dat +="Code Phrases: [GLOB.syndicate_code_phrase]"
+ dat +="Code Responses: [GLOB.syndicate_code_response]"
dat += "
Antagonist Teams
"
dat += "View Teams
"
if(SSticker.mode.syndicates.len)
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index bb279036bb7..324731de564 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -20,9 +20,7 @@
Admin Secrets
Game
Show AI Laws
- Show Game Mode
Show Crew Manifest
- Show current traitors and objectives
Show code phrases and responses
Set Night Shift Mode
Bombs
@@ -87,8 +85,11 @@
Reinforce Station
Move the Gamma Armory
+ Renames
+ Rename Station Name
+ Reset Station Name
+ Rename Central Comand
"}
-
if(2)
if(check_rights((R_SERVER|R_EVENT),0))
dat += {"
@@ -117,6 +118,7 @@
The floor is lava! (DANGEROUS: extremely lame)
The floor is fake-lava! (non-harmful)
Turn all humans into monkeys
+ Polymorph All
Make all items look like guns
Warp all Players to Prison
Make all players stupid
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 84629024c7a..46826ce6fba 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -2390,38 +2390,7 @@
if(!check_rights(R_ADMIN|R_EVENT)) return
var/mob/living/M = locateUID(href_list["BlueSpaceArtillery"])
- if(!isliving(M))
- to_chat(usr, "This can only be used on instances of type /mob/living", confidential=TRUE)
- return
-
- if(alert(owner, "Are you sure you wish to hit [key_name(M)] with Bluespace Artillery?", "Confirm Firing?" , "Yes" , "No") != "Yes")
- return
-
- if(GLOB.BSACooldown)
- to_chat(owner, "Standby. Reload cycle in progress. Gunnery crews ready in five seconds!")
- return
-
- GLOB.BSACooldown = 1
- spawn(50)
- GLOB.BSACooldown = 0
-
- to_chat(M, "You've been hit by bluespace artillery!")
- log_admin("[key_name(M)] has been hit by Bluespace Artillery fired by [key_name(owner)]")
- message_admins("[key_name_admin(M)] has been hit by Bluespace Artillery fired by [key_name_admin(owner)]")
-
- var/turf/simulated/floor/T = get_turf(M)
- if(istype(T))
- if(prob(80))
- T.break_tile_to_plating()
- else
- T.break_tile()
-
- if(M.health <= 1)
- M.gib()
- else
- M.adjustBruteLoss(min(99,(M.health - 1)))
- M.Weaken(40 SECONDS)
- M.Stuttering(40 SECONDS)
+ usr.client.bluespace_artillery(M)
else if(href_list["CentcommReply"])
if(!check_rights(R_ADMIN))
@@ -2892,6 +2861,10 @@
if(!check_rights(R_SPAWN)) return
return create_mob(usr)
+ else if(href_list["dupe_marked_datum"])
+ if(!check_rights(R_SPAWN)) return
+ return DuplicateObject(marked_datum, perfectcopy=1, newloc=get_turf(usr))
+
else if(href_list["object_list"]) //this is the laggiest thing ever
if(!check_rights(R_SPAWN)) return
@@ -3100,6 +3073,35 @@
if("tripleAI")
usr.client.triple_ai()
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Triple AI")
+ if("set_station_name")
+ if(!check_rights(R_ADMIN | R_EVENT))
+ return
+
+ if(!you_realy_want_do_this())
+ return
+
+ var/new_name = tgui_input_text(usr, "Пожалуйста, введите новое название станции.", "Что?", "")
+ if(!new_name)
+ return
+ change_station_name(new_name)
+ log_and_message_admins("renamed the station to: [new_name].")
+ GLOB.event_announcement.Announce("Решением [command_name()] станция переименована в \"[new_name]\".")
+
+ if("set_centcomm_name")
+ if(!check_rights(R_ADMIN | R_EVENT))
+ return
+ if(!you_realy_want_do_this())
+ return
+ usr.client.cmd_change_command_name()
+
+ if("reset_station_name")
+ if(!check_rights(R_ADMIN))
+ return
+ var/new_name = new_station_name()
+ change_station_name(new_name)
+ log_and_message_admins("reset the station name.")
+ GLOB.event_announcement.Announce("Решением [command_name()] станция переименована в \"[new_name]\".")
+
if("gravity")
if(!(SSticker && SSticker.mode))
to_chat(usr, "Please wait until the game starts! Not sure how it will work otherwise.", confidential=TRUE)
@@ -3306,6 +3308,8 @@
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Weather Ash Storm")
SSweather.run_weather(/datum/weather/ash_storm)
message_admins("[key_name_admin(usr)] spawned an ash storm on the mining level")
+ if("polymorph")
+ usr.client.polymorph_all()
if("stupify")
if(!you_realy_want_do_this())
return
@@ -3326,15 +3330,33 @@
W.item_state = "gun"
message_admins("[key_name_admin(usr)] made every item look like a gun")
if("schoolgirl") // nyaa~ How much are you paying attention in reviews?
+ if(!check_rights(R_EVENT))
+ return
+
if(!you_realy_want_do_this())
return
+
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Chinese Cartoons")
- for(var/obj/item/clothing/under/W in world)
- W.icon_state = "schoolgirl"
- W.item_state = "w_suit"
- W.item_color = "schoolgirl"
- message_admins("[key_name_admin(usr)] activated Japanese Animes mode")
- world << sound('sound/AI/animes.ogg')
+ log_and_message_admins("made everything kawaii.")
+ for(var/mob/living/carbon/human/human in GLOB.mob_list)
+ SEND_SOUND(human, 'sound/AI/animes.ogg')
+ if(!human.dna.species.nojumpsuit && !isvox(human) && !isplasmaman(human) \
+ && !isshadowling(human) && !isvoxarmalis(human) && !is_space_or_openspace(get_turf(human)))
+ var/obj/item/clothing/head/kitty/hat = new
+ var/seifuku = pick(typesof(/obj/item/clothing/under/schoolgirl))
+ var/obj/item/clothing/under/schoolgirl/uniform = new seifuku
+ human.drop_item_ground(human.w_uniform, TRUE)
+ human.equip_to_slot_or_del(uniform, uniform.slot_flags)
+ human.drop_item_ground(human.head, TRUE)
+ human.equip_to_slot_or_del(hat, hat.slot_flags)
+ ADD_TRAIT(uniform, TRAIT_NODROP, INNATE_TRAIT)
+ ADD_TRAIT(hat, TRAIT_NODROP, INNATE_TRAIT)
+ var/list/honorifics = list(MALE = list("кун"), FEMALE = list("чан","тан"), NEUTER = list("сан")) //John Robust -> Robust-kun
+ var/list/names = splittext(human.real_name," ")
+ var/newname = "[names[names.len]]-[pick(honorifics[human.gender])]"
+ human.name = newname
+ human.real_name = newname
+
if("eagles")//
if(!you_realy_want_do_this())
return
@@ -3577,12 +3599,6 @@
usr << browse(dat, "window=jobdebug;size=600x500")
if("showailaws")
output_ai_laws()
- if("showgm")
- if(!SSticker)
- alert("The game hasn't started yet!")
- else if(SSticker.mode)
- alert("The game mode is [SSticker.mode.name]")
- else alert("For some reason there's a ticker, but not a game mode")
if("manifest")
var/dat = {"Showing Crew Manifest.
"}
dat += "Name | Position |
"
@@ -3592,11 +3608,6 @@
dat += text("[] | [] |
", H.name, H.get_assignment())
dat += "
"
usr << browse(dat, "window=manifest;size=440x410")
- if("check_antagonist")
- check_antagonists()
- if("view_codewords")
- to_chat(usr, "Code Phrases: [GLOB.syndicate_code_phrase]", confidential=TRUE)
- to_chat(usr, "Code Responses: [GLOB.syndicate_code_response]", confidential=TRUE)
if("DNA")
var/dat = {"Showing DNA from blood.
"}
dat += "Name | DNA | Blood Type | Race Blood Type |
"
diff --git a/code/modules/admin/verbs/bluespacearty.dm b/code/modules/admin/verbs/bluespacearty.dm
new file mode 100644
index 00000000000..3fa36d625e1
--- /dev/null
+++ b/code/modules/admin/verbs/bluespacearty.dm
@@ -0,0 +1,40 @@
+/client/proc/bluespace_artillery(mob/living/target in GLOB.mob_list)
+ set name = "Bluespace Artillery"
+ set category = "Event"
+
+ if(!check_rights(R_ADMIN|R_EVENT))
+ return
+
+ if(!isliving(target))
+ to_chat(usr, span_warning("Это можно использовать только на объектах типа /mob/living"), confidential = TRUE)
+ return
+
+ if(tgui_alert(usr, "Вы уверены, что хотите выстрелить по [key_name(target)] из Блюспейс Артиллерии?", "Подтверждение выстрела?" , list("Да" , "Нет")) != "Да")
+ return
+
+ if(GLOB.BSACooldown)
+ to_chat(usr, "Подождите. Идет цикл перезарядки. Артиллерийские расчеты будут готовы через пять секунд!")
+ return
+
+ GLOB.BSACooldown = 1
+ spawn(50)
+ GLOB.BSACooldown = 0
+
+ to_chat(target, "По вам попала блюспейс артиллерия!")
+ log_admin("[key_name(target)] has been hit by Bluespace Artillery fired by [key_name(usr)]")
+ message_admins("[key_name_admin(target)] has been hit by Bluespace Artillery fired by [key_name_admin(usr)]")
+
+ var/turf/simulated/floor/T = get_turf(target)
+ if(istype(T))
+ if(prob(80))
+ T.break_tile_to_plating()
+ else
+ T.break_tile()
+
+ if(target.health <= 1)
+ target.gib()
+ else
+ target.adjustBruteLoss(min(99,(target.health - 1)))
+ target.Weaken(40 SECONDS)
+ target.Stuttering(40 SECONDS)
+
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 359a324496e..f529c7da1af 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -1231,3 +1231,53 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!source)
return
REMOVE_TRAIT(D, chosen_trait, source)
+
+/client/proc/cmd_change_command_name()
+ set category = "Admin.Event"
+ set name = "Change Command Name"
+
+ if(!check_rights(R_ADMIN | R_EVENT))
+ return
+
+ var/input = tgui_input_text(usr, "Введите имя для Центрального Командования.", "Что?", "")
+ if(!input)
+ return
+ change_command_name(input)
+ log_and_message_admins("has changed Central Command's name to [input]")
+
+
+/client/proc/polymorph_all()
+ set category = "Event"
+ set name = "Polymorph All"
+ set desc = "Applies the effects of the bolt of change to every single mob."
+
+ if(!holder)
+ return
+
+ var/confirm = tgui_alert(src, "Пожалуйста, подтвердите, что вы хотите полиморфировать всех?", "Подтверждение", list("Да", "Нет"))
+ if(confirm != "Да")
+ return
+
+ var/keep_name = tgui_alert(src, "Вы хотите, чтобы существа сохранили свои имена?", "Сохранить имена?", list("Да", "Нет"))
+
+ var/list/mobs = shuffle(GLOB.alive_player_list.Copy()) // might change while iterating
+
+ log_and_message_admins("polymorphed ALL living mobs.")
+
+ for(var/mob/living/M in mobs)
+ CHECK_TICK
+
+ if(!M || !M.name || !M.real_name)
+ continue
+
+ M.audible_message(span_italics("...ваббаджек...ваббаджек..."))
+ playsound(M.loc, 'sound/magic/Staff_Change.ogg', 50, 1, -1)
+ var/name = M.name
+ var/real_name = M.real_name
+
+ var/mob/living/new_mob = wabbajack(M)
+ if(keep_name == "Да" && new_mob)
+ new_mob.name = name
+ new_mob.real_name = real_name
+
+
diff --git a/code/modules/admin/verbs/toggledebugverbs.dm b/code/modules/admin/verbs/toggledebugverbs.dm
index 65e5c00465f..de1eb40f6d3 100644
--- a/code/modules/admin/verbs/toggledebugverbs.dm
+++ b/code/modules/admin/verbs/toggledebugverbs.dm
@@ -16,7 +16,6 @@ GLOBAL_LIST_INIT(admin_verbs_show_debug_verbs, list(
/datum/admins/proc/show_traitor_panel,
/client/proc/print_jobban_old,
/client/proc/print_jobban_old_filter,
- /client/proc/forceEvent,
/client/proc/admin_redo_space_transitions,
/client/proc/make_turf_space_map,
/client/proc/vv_by_ref
@@ -25,11 +24,17 @@ GLOBAL_LIST_INIT(admin_verbs_show_debug_verbs, list(
// Would be nice to make this a permanent admin pref so we don't need to click it each time
/client/proc/enable_debug_verbs()
set category = "Debug"
- set name = "Debug verbs"
+ set name = "Debug verbs - Enable"
if(!check_rights(R_DEBUG))
return
- add_verb(src, GLOB.admin_verbs_show_debug_verbs)
+ verbs -= /client/proc/enable_debug_verbs
+ verbs.Add(/client/proc/disable_debug_verbs, GLOB.admin_verbs_show_debug_verbs)
+
+/client/proc/disable_debug_verbs()
+ set category = "Debug"
+ set name = "Debug verbs - Disable"
- SSblackbox.record_feedback("tally", "admin_verb", 1, "Debug Verbs") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc!
+ verbs.Remove(/client/proc/disable_debug_verbs, GLOB.admin_verbs_show_debug_verbs)
+ verbs += /client/proc/enable_debug_verbs
diff --git a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
index 5a933251872..e436b0f1fe2 100644
--- a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
+++ b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
@@ -41,3 +41,14 @@
continue
return 1
return 0
+
+/datum/mapGeneratorModule/bottomLayer/massdelete
+ spawnableAtoms = list()
+ spawnableTurfs = list()
+
+/datum/mapGeneratorModule/bottomLayer/massdelete/generate()
+ if(!mother)
+ return
+ for(var/V in mother.map)
+ var/turf/T = V
+ T.empty()
diff --git a/code/modules/procedural_mapping/mapGenerators/cult.dm b/code/modules/procedural_mapping/mapGenerators/cult.dm
new file mode 100644
index 00000000000..1a823d599ec
--- /dev/null
+++ b/code/modules/procedural_mapping/mapGenerators/cult.dm
@@ -0,0 +1,31 @@
+/datum/mapGeneratorModule/bottomLayer/cultFloor
+ spawnableTurfs = list(/turf/simulated/floor/engine/cult = 100)
+
+/datum/mapGeneratorModule/border/cultWalls
+ spawnableTurfs = list(/turf/simulated/wall/cult = 100)
+
+
+/datum/mapGeneratorModule/bottomLayer/clockFloor
+ spawnableTurfs = list(/turf/simulated/floor/clockwork = 100)
+
+/datum/mapGeneratorModule/border/clockWalls
+ spawnableTurfs = list(/turf/simulated/wall/clockwork = 100)
+
+
+/datum/mapGenerator/cult //walls and floor only
+ modules = list(/datum/mapGeneratorModule/bottomLayer/cultFloor, \
+ /datum/mapGeneratorModule/border/cultWalls, \
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+
+/datum/mapGenerator/clock //walls and floor only
+ modules = list(/datum/mapGeneratorModule/bottomLayer/clockFloor, \
+ /datum/mapGeneratorModule/border/clockWalls, \
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+
+/datum/mapGenerator/cult/floor //floors only
+ modules = list(/datum/mapGeneratorModule/bottomLayer/cultFloor, \
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+
+/datum/mapGenerator/clock/floor //floor only
+ modules = list(/datum/mapGeneratorModule/bottomLayer/clockFloor, \
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
diff --git a/paradise.dme b/paradise.dme
index 22bad91982d..80da0e922d1 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1584,6 +1584,7 @@
#include "code\modules\admin\verbs\antagonist_menu.dm"
#include "code\modules\admin\verbs\asays.dm"
#include "code\modules\admin\verbs\atmosdebug.dm"
+#include "code\modules\admin\verbs\bluespacearty.dm"
#include "code\modules\admin\verbs\borgpanel.dm"
#include "code\modules\admin\verbs\BrokenInhands.dm"
#include "code\modules\admin\verbs\cantcomm_cargo.dm"
@@ -2955,6 +2956,7 @@
#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm"
#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm"
#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm"
+#include "code\modules\procedural_mapping\mapGenerators\cult.dm"
#include "code\modules\procedural_mapping\mapGenerators\nature.dm"
#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm"
#include "code\modules\projectiles\ammunition.dm"