mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-02-07 14:59:13 +00:00
## About The Pull Request Remakes Battle Arcade from just about the ground up, with exceptions taken for emagged stuff since I didn't really want to touch its behavior. The Battle Arcade now has stages that players can go through, unlocking a stage by beating 2 enemies and the boss of the previous one, but this must all be done in a row. You can choose to take a break between each battle and there's a good chance you'll sleep just fine but there's also a chance it can go wrong either through an ambush or robbery. The Inn lets you restore everything for 15 gold and you can buy a sword and armor, each level you unlock is a new sword and armor pair you can buy that's better than the last, it's 30 gold each but scales up as you progress through levels. They are really worth getting so it's best to try to not lose your money early in. The battle system is nearly the same as how it was before but I removed the poor combo system that plagued the old arcade as one big knowledge lock, now it's more just turn based. The game is built on permadeath so dying means you restart from the beginning, but if you are going to lose you can try to escape instead which costs you half of your gold. Getting to higher levels increases the difficulty of enemies but also increases the gaming exp rewards which could make this a better way to get exp if you can get good at it. Gaming EXP is used to increase chances of counterattacking but doesn't give any extra health to the player. I also removed the exploit of being able to screwdriver arcade cabinets because people would do that if they thought they were on the verge of losing to bypass the effects of loss. I instead replaced it with a new interaction that the Curator's display case key can be used to reset arcade cabinets (there's several keys on the chain so it made sense to me), which I added solely because I thought Curators would be the type of person to have run an actual arcade. This is some gameplay https://github.com/tgstation/tgstation/assets/53777086/499083f5-75cc-43b5-b457-017a012beede As a misc sidenote, I also split up the arcade file just like how Orion Trail was before, just for neat code organization. The Inn keeper is straight up just a photo of my localhost dude, he's not a player reference or anything it's not my actual character. I also have no idea how well balanced this is cause I suck at it lol. ## Why It's Good For The Game Battle Arcade is one of 3 last machines in my hackmd here to turn into TGUI https://hackmd.io/XLt5MoRvRxuhFbwtk4VAUA?view I've always thought the current version of battle arcade is quite lame and lacks any progression, like Orion Trail I thought that since I was moving this to TGUI, it would also be a perfect opportunity to revamp it and try to improve on where it failed before, especially since the alternative (NTOS Arcade) is also lame as hell and is even lamer than HTML battle arcade (spam mana, then spam health, then just spam attack, rinse and repeat). This will hopefully be more entertaining and give players sense that they are getting through a series of tasks rather than doing one same one again and again. ## Changelog 🆑 JohnFulpWillard, Zeek the Rat add: Battle Arcade has been completely overhauled in a new progression system, this time using TGUI. add: The Curator's keys can now reset arcade cabinets. balance: You now need to be literate to play arcade games, except for Mediborg's Amputation Adventure. fix: You can no longer screwdriver emagged arcade consoles. Accept your fate. fix: Silicons can no longer play Mediborg's Amputation Adventure. /🆑 --------- Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
283 lines
13 KiB
Plaintext
283 lines
13 KiB
Plaintext
// Server Tab - Server Verbs
|
|
|
|
/client/proc/toggle_random_events()
|
|
set category = "Server"
|
|
set name = "Toggle random events on/off"
|
|
set desc = "Toggles random events such as meteors, black holes, blob (but not space dust) on/off"
|
|
var/new_are = !CONFIG_GET(flag/allow_random_events)
|
|
CONFIG_SET(flag/allow_random_events, new_are)
|
|
message_admins("[key_name_admin(usr)] has [new_are ? "enabled" : "disabled"] random events.")
|
|
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Random Events", "[new_are ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc!
|
|
|
|
/client/proc/toggle_hub()
|
|
set category = "Server"
|
|
set name = "Toggle Hub"
|
|
|
|
world.update_hub_visibility(!GLOB.hub_visibility)
|
|
|
|
log_admin("[key_name(usr)] has toggled the server's hub status for the round, it is now [(GLOB.hub_visibility?"on":"off")] the hub.")
|
|
message_admins("[key_name_admin(usr)] has toggled the server's hub status for the round, it is now [(GLOB.hub_visibility?"on":"off")] the hub.")
|
|
if (GLOB.hub_visibility && !world.reachable)
|
|
message_admins("WARNING: The server will not show up on the hub because byond is detecting that a filewall is blocking incoming connections.")
|
|
|
|
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggled Hub Visibility", "[GLOB.hub_visibility ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc!
|
|
|
|
/datum/admins/proc/restart()
|
|
set category = "Server"
|
|
set name = "Reboot World"
|
|
set desc = "Restarts the world immediately"
|
|
if (!usr.client.holder)
|
|
return
|
|
|
|
var/localhost_addresses = list("127.0.0.1", "::1")
|
|
var/list/options = list("Regular Restart", "Regular Restart (with delay)", "Hard Restart (No Delay/Feeback Reason)", "Hardest Restart (No actions, just reboot)")
|
|
if(world.TgsAvailable())
|
|
options += "Server Restart (Kill and restart DD)";
|
|
|
|
if(SSticker.admin_delay_notice)
|
|
if(alert(usr, "Are you sure? An admin has already delayed the round end for the following reason: [SSticker.admin_delay_notice]", "Confirmation", "Yes", "No") != "Yes")
|
|
return FALSE
|
|
|
|
var/result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options
|
|
if(result)
|
|
BLACKBOX_LOG_ADMIN_VERB("Reboot World")
|
|
var/init_by = "Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]."
|
|
switch(result)
|
|
if("Regular Restart")
|
|
if(!(isnull(usr.client.address) || (usr.client.address in localhost_addresses)))
|
|
if(alert(usr, "Are you sure you want to restart the server?","This server is live", "Restart", "Cancel") != "Restart")
|
|
return FALSE
|
|
SSticker.Reboot(init_by, "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10)
|
|
if("Regular Restart (with delay)")
|
|
var/delay = input("What delay should the restart have (in seconds)?", "Restart Delay", 5) as num|null
|
|
if(!delay)
|
|
return FALSE
|
|
if(!(isnull(usr.client.address) || (usr.client.address in localhost_addresses)))
|
|
if(alert(usr,"Are you sure you want to restart the server?","This server is live", "Restart", "Cancel") != "Restart")
|
|
return FALSE
|
|
SSticker.Reboot(init_by, "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", delay * 10)
|
|
if("Hard Restart (No Delay, No Feeback Reason)")
|
|
to_chat(world, "World reboot - [init_by]")
|
|
world.Reboot()
|
|
if("Hardest Restart (No actions, just reboot)")
|
|
to_chat(world, "Hard world reboot - [init_by]")
|
|
world.Reboot(fast_track = TRUE)
|
|
if("Server Restart (Kill and restart DD)")
|
|
to_chat(world, "Server restart - [init_by]")
|
|
world.TgsEndProcess()
|
|
|
|
/datum/admins/proc/end_round()
|
|
set category = "Server"
|
|
set name = "End Round"
|
|
set desc = "Attempts to produce a round end report and then restart the server organically."
|
|
|
|
if (!usr.client.holder)
|
|
return
|
|
var/confirm = tgui_alert(usr, "End the round and restart the game world?", "End Round", list("Yes", "Cancel"))
|
|
if(confirm == "Cancel")
|
|
return
|
|
if(confirm == "Yes")
|
|
SSticker.force_ending = FORCE_END_ROUND
|
|
BLACKBOX_LOG_ADMIN_VERB("End Round")
|
|
|
|
/datum/admins/proc/toggleooc()
|
|
set category = "Server"
|
|
set desc = "Toggle dis bitch"
|
|
set name = "Toggle OOC"
|
|
toggle_ooc()
|
|
log_admin("[key_name(usr)] toggled OOC.")
|
|
message_admins("[key_name_admin(usr)] toggled OOC.")
|
|
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle OOC", "[GLOB.ooc_allowed ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc!
|
|
|
|
/datum/admins/proc/toggleoocdead()
|
|
set category = "Server"
|
|
set desc = "Toggle dis bitch"
|
|
set name = "Toggle Dead OOC"
|
|
toggle_dooc()
|
|
|
|
log_admin("[key_name(usr)] toggled OOC.")
|
|
message_admins("[key_name_admin(usr)] toggled Dead OOC.")
|
|
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Dead OOC", "[GLOB.dooc_allowed ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc!
|
|
|
|
/datum/admins/proc/startnow()
|
|
set category = "Server"
|
|
set desc = "Start the round RIGHT NOW"
|
|
set name = "Start Now"
|
|
if(SSticker.current_state == GAME_STATE_PREGAME || SSticker.current_state == GAME_STATE_STARTUP)
|
|
if(!SSticker.start_immediately)
|
|
var/localhost_addresses = list("127.0.0.1", "::1")
|
|
if(!(isnull(usr.client.address) || (usr.client.address in localhost_addresses)))
|
|
if(tgui_alert(usr, "Are you sure you want to start the round?","Start Now",list("Start Now","Cancel")) != "Start Now")
|
|
return FALSE
|
|
SSticker.start_immediately = TRUE
|
|
log_admin("[usr.key] has started the game.")
|
|
var/msg = ""
|
|
if(SSticker.current_state == GAME_STATE_STARTUP)
|
|
msg = " (The server is still setting up, but the round will be \
|
|
started as soon as possible.)"
|
|
message_admins("<font color='blue'>[usr.key] has started the game.[msg]</font>")
|
|
BLACKBOX_LOG_ADMIN_VERB("Start Now")
|
|
return TRUE
|
|
SSticker.start_immediately = FALSE
|
|
SSticker.SetTimeLeft(1800)
|
|
to_chat(world, span_infoplain(span_bold("The game will start in 180 seconds.")))
|
|
SEND_SOUND(world, sound('sound/ai/default/attention.ogg'))
|
|
message_admins("<font color='blue'>[usr.key] has cancelled immediate game start. Game will start in 180 seconds.</font>")
|
|
log_admin("[usr.key] has cancelled immediate game start.")
|
|
else
|
|
to_chat(usr, "<span class='warningplain'><font color='red'>Error: Start Now: Game has already started.</font></span>")
|
|
return FALSE
|
|
|
|
/datum/admins/proc/delay_round_end()
|
|
set category = "Server"
|
|
set desc = "Prevent the server from restarting"
|
|
set name = "Delay Round End"
|
|
|
|
if(!check_rights(R_SERVER))
|
|
return
|
|
|
|
if(SSticker.delay_end)
|
|
tgui_alert(usr, "The round end is already delayed. The reason for the current delay is: \"[SSticker.admin_delay_notice]\"", "Alert", list("Ok"))
|
|
return
|
|
|
|
var/delay_reason = input(usr, "Enter a reason for delaying the round end", "Round Delay Reason") as null|text
|
|
|
|
if(isnull(delay_reason))
|
|
return
|
|
|
|
if(SSticker.delay_end)
|
|
tgui_alert(usr, "The round end is already delayed. The reason for the current delay is: \"[SSticker.admin_delay_notice]\"", "Alert", list("Ok"))
|
|
return
|
|
|
|
SSticker.delay_end = TRUE
|
|
SSticker.admin_delay_notice = delay_reason
|
|
|
|
log_admin("[key_name(usr)] delayed the round end for reason: [SSticker.admin_delay_notice]")
|
|
message_admins("[key_name_admin(usr)] delayed the round end for reason: [SSticker.admin_delay_notice]")
|
|
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Delay Round End", "Reason: [delay_reason]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc!
|
|
|
|
/datum/admins/proc/toggleenter()
|
|
set category = "Server"
|
|
set desc = "People can't enter"
|
|
set name = "Toggle Entering"
|
|
if(!SSlag_switch.initialized)
|
|
return
|
|
SSlag_switch.set_measure(DISABLE_NON_OBSJOBS, !SSlag_switch.measures[DISABLE_NON_OBSJOBS])
|
|
log_admin("[key_name(usr)] toggled new player game entering. Lag Switch at index ([DISABLE_NON_OBSJOBS])")
|
|
message_admins("[key_name_admin(usr)] toggled new player game entering [SSlag_switch.measures[DISABLE_NON_OBSJOBS] ? "OFF" : "ON"].")
|
|
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Entering", "[!SSlag_switch.measures[DISABLE_NON_OBSJOBS] ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc!
|
|
|
|
/datum/admins/proc/toggleAI()
|
|
set category = "Server"
|
|
set desc = "People can't be AI"
|
|
set name = "Toggle AI"
|
|
var/alai = CONFIG_GET(flag/allow_ai)
|
|
CONFIG_SET(flag/allow_ai, !alai)
|
|
if (alai)
|
|
to_chat(world, span_bold("The AI job is no longer chooseable."), confidential = TRUE)
|
|
else
|
|
to_chat(world, span_bold("The AI job is chooseable now."), confidential = TRUE)
|
|
log_admin("[key_name(usr)] toggled AI allowed.")
|
|
world.update_status()
|
|
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle AI", "[!alai ? "Disabled" : "Enabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc!
|
|
|
|
/datum/admins/proc/toggleaban()
|
|
set category = "Server"
|
|
set desc = "Respawn basically"
|
|
set name = "Toggle Respawn"
|
|
|
|
var/respawn_state = CONFIG_GET(flag/allow_respawn)
|
|
var/new_state = -1
|
|
var/new_state_text = ""
|
|
switch(respawn_state)
|
|
if(RESPAWN_FLAG_DISABLED) // respawn currently disabled
|
|
new_state = RESPAWN_FLAG_FREE
|
|
new_state_text = "Enabled"
|
|
to_chat(world, span_bold("You may now respawn."), confidential = TRUE)
|
|
|
|
if(RESPAWN_FLAG_FREE) // respawn currently enabled
|
|
new_state = RESPAWN_FLAG_NEW_CHARACTER
|
|
new_state_text = "Enabled, Different Slot"
|
|
to_chat(world, span_bold("You may now respawn as a different character."), confidential = TRUE)
|
|
|
|
if(RESPAWN_FLAG_NEW_CHARACTER) // respawn currently enabled for different slot characters only
|
|
new_state = RESPAWN_FLAG_DISABLED
|
|
new_state_text = "Disabled"
|
|
to_chat(world, span_bold("You may no longer respawn :("), confidential = TRUE)
|
|
|
|
else
|
|
WARNING("Invalid respawn state in config: [respawn_state]")
|
|
|
|
if(new_state == -1)
|
|
to_chat(usr, span_warning("The config for respawn is set incorrectly, please complain to your nearest server host (or fix it yourself). \
|
|
In the meanwhile respawn has been set to \"Off\"."))
|
|
new_state = RESPAWN_FLAG_DISABLED
|
|
new_state_text = "Disabled"
|
|
|
|
CONFIG_SET(flag/allow_respawn, new_state)
|
|
|
|
message_admins(span_adminnotice("[key_name_admin(usr)] toggled respawn to \"[new_state_text]\"."))
|
|
log_admin("[key_name(usr)] toggled respawn to \"[new_state_text]\".")
|
|
|
|
world.update_status()
|
|
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Respawn", "[new_state_text]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc!
|
|
|
|
/datum/admins/proc/delay()
|
|
set category = "Server"
|
|
set desc = "Delay the game start"
|
|
set name = "Delay Pre-Game"
|
|
|
|
var/newtime = input("Set a new time in seconds. Set -1 for indefinite delay.","Set Delay",round(SSticker.GetTimeLeft()/10)) as num|null
|
|
if(!newtime)
|
|
return
|
|
if(SSticker.current_state > GAME_STATE_PREGAME)
|
|
return tgui_alert(usr, "Too late... The game has already started!")
|
|
newtime = newtime*10
|
|
SSticker.SetTimeLeft(newtime)
|
|
SSticker.start_immediately = FALSE
|
|
if(newtime < 0)
|
|
to_chat(world, span_infoplain(span_bold("The game start has been delayed.")), confidential = TRUE)
|
|
log_admin("[key_name(usr)] delayed the round start.")
|
|
else
|
|
to_chat(world, span_infoplain(span_bold("The game will start in [DisplayTimeText(newtime)].")), confidential = TRUE)
|
|
SEND_SOUND(world, sound('sound/ai/default/attention.ogg'))
|
|
log_admin("[key_name(usr)] set the pre-game delay to [DisplayTimeText(newtime)].")
|
|
BLACKBOX_LOG_ADMIN_VERB("Delay Game Start")
|
|
|
|
/datum/admins/proc/set_admin_notice()
|
|
set category = "Server"
|
|
set name = "Set Admin Notice"
|
|
set desc ="Set an announcement that appears to everyone who joins the server. Only lasts this round"
|
|
if(!check_rights(0))
|
|
return
|
|
|
|
var/new_admin_notice = input(src,"Set a public notice for this round. Everyone who joins the server will see it.\n(Leaving it blank will delete the current notice):","Set Notice",GLOB.admin_notice) as message|null
|
|
if(new_admin_notice == null)
|
|
return
|
|
if(new_admin_notice == GLOB.admin_notice)
|
|
return
|
|
if(new_admin_notice == "")
|
|
message_admins("[key_name(usr)] removed the admin notice.")
|
|
log_admin("[key_name(usr)] removed the admin notice:\n[GLOB.admin_notice]")
|
|
else
|
|
message_admins("[key_name(usr)] set the admin notice.")
|
|
log_admin("[key_name(usr)] set the admin notice:\n[new_admin_notice]")
|
|
to_chat(world, span_adminnotice("<b>Admin Notice:</b>\n \t [new_admin_notice]"), confidential = TRUE)
|
|
BLACKBOX_LOG_ADMIN_VERB("Set Admin Notice")
|
|
GLOB.admin_notice = new_admin_notice
|
|
return
|
|
|
|
/datum/admins/proc/toggleguests()
|
|
set category = "Server"
|
|
set desc = "Guests can't enter"
|
|
set name = "Toggle guests"
|
|
var/new_guest_ban = !CONFIG_GET(flag/guest_ban)
|
|
CONFIG_SET(flag/guest_ban, new_guest_ban)
|
|
if (new_guest_ban)
|
|
to_chat(world, span_bold("Guests may no longer enter the game."), confidential = TRUE)
|
|
else
|
|
to_chat(world, span_bold("Guests may now enter the game."), confidential = TRUE)
|
|
log_admin("[key_name(usr)] toggled guests game entering [!new_guest_ban ? "" : "dis"]allowed.")
|
|
message_admins(span_adminnotice("[key_name_admin(usr)] toggled guests game entering [!new_guest_ban ? "" : "dis"]allowed."))
|
|
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Guests", "[!new_guest_ban ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc!
|