mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-09 00:13:55 +00:00
## About The Pull Request I swear it's the last one  ### Added two new fishes to the rift pool:  #### The __mossglob__ is the Fisherman's Bane. The apex of evil. The be-all-end-all in fisher destruction. It is haunted. It deals toxic damage. It throws itself around. It's coated in a deadly and hallucinogenic compound. Its mossy coating is slippery. It revives itself. It throws itself out of aquariums. Best of all, it is extremely easy to catch. How do you deal with it? Well, probably by not fishing in a portal to hell. Otherwise... good luck? Suiciding into it empowers it by 15% and seals you inside. JOIN THE MOSS!  #### The __babbelfish__ is a strange sort of predator, a psychic fish. It casts a psychic aura near itself, ~~disturbing people~~ (nvm lol the demoralizer datum is bad), killing fish nearby and then eating their corpses. When it dies, it emits an awesome psychic wail, which will instantly kill all fish in audible range and severely incapacitate psy-sensitive humans: I can't play the ogg here but credits to grungus for it   There is also a secret, secondary function of the babbelfish: Splitting one in half (a terrible idea) and shoving it inside your ears will unlock your full psychic potential, granting you psychic resistance and grant you the ability to either understand or speak every single language, at a terrible cost. #### ARMS Failing the fishing minigame while fishing in a heretical rift will now cause the rift to tear your arm (and its fishing rod) off your joints and greedily slurp it up. The Mansus does not care for losers. (Getting bored and walking away while the minigame is up also counts as failure.) However, these missing items can, in fact, be fished back up, which also includes arms -and- heads lost normally to the rift! Not only that, but you're able to fish up random arms of any type, presumably from other fools across time and space. #### This PR probably shouldn't be merged until the bug that causes finite fish counts to not be finite is fixed. Infinite fire sharks are bad enough... Added ABSTRACT flag to profound_fisher fake rod. objectify() now works with instances of objects. Apparently snuck in a random-ass refactor to smoker lungs. Psychic resistance now prevents the instadeath from trying to telekinetically grasp at a opened rift. Hallucinogenic fish with a stinger now inject their hallucinogenic toxins. I woudl like to preemptively apologize to ghommie ## Why It's Good For The Game __Mossglob__ I think the game's missing a fish that's just extremely dangerous to be around, the piscine equivalent to radioactive waste. You can't bin or tank it, because it flies off. You can't kill it, because it's atmos-proof and revives itself anyway. Trying to keep it on a table to turn into disgusting mold 'slices' is a challenge in and of itself. This fish will (not) make people think twice about fishing in hell, and give another reason for security and command to give PSAs to not interact with the rifts across space and time around the station, which I think is wonderful. __Babbelfish__ This fish punishes sloppy fishermen who hold up their catch and then store it inside their bag for the poor fish to slowly asphixiate to death in. The fish griefing that will happen from it will be _wonderful_. The organ thing is a clear reference to HHG, but it has its own twist. You can speak all languages, or understand all languages... but rarely both. It'll make for some silly situations where people just 'make strange noises' at you or try to act as translator for, say, ashwalkers or xenomorphs while being completely clueless as to what anyone is actually saying. __ARMS__ Arms. Arms arms. Someone asked me if rifts let you fish up arms and i said ___IT DOES NOW___. ## Changelog 🆑 Ghommie, carlarc, grungus add: Added two new fish to heretic rift fishing. add: You can now fish up arms, heads, and other items lost to heretic rifts! admin: objectify() now works with instances of objects. Mark a player, then an object, and use those marks to call that global proc and you can turn people into pre-existing items. add: Psychic resistance now prevents the instadeath from trying to telekinetically grasp at a opened rift. /🆑 --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
209 lines
8.9 KiB
Plaintext
209 lines
8.9 KiB
Plaintext
ADMIN_VERB(admin_explosion, R_ADMIN|R_FUN, "Explosion", ADMIN_VERB_NO_DESCRIPTION, ADMIN_CATEGORY_HIDDEN, atom/orignator as obj|mob|turf)
|
|
var/devastation = input(user, "Range of total devastation. -1 to none", "Input") as num|null
|
|
if(devastation == null)
|
|
return
|
|
var/heavy = input(user, "Range of heavy impact. -1 to none", "Input") as num|null
|
|
if(heavy == null)
|
|
return
|
|
var/light = input(user, "Range of light impact. -1 to none", "Input") as num|null
|
|
if(light == null)
|
|
return
|
|
var/flash = input(user, "Range of flash. -1 to none", "Input") as num|null
|
|
if(flash == null)
|
|
return
|
|
var/flames = input(user, "Range of flames. -1 to none", "Input") as num|null
|
|
if(flames == null)
|
|
return
|
|
|
|
if ((devastation != -1) || (heavy != -1) || (light != -1) || (flash != -1) || (flames != -1))
|
|
if ((devastation > 20) || (heavy > 20) || (light > 20) || (flames > 20))
|
|
if (tgui_alert(user, "Are you sure you want to do this? It will laaag.", "Confirmation", list("Yes", "No")) == "No")
|
|
return
|
|
|
|
explosion(orignator, devastation, heavy, light, flames, flash, explosion_cause = user.mob)
|
|
log_admin("[key_name(user)] created an explosion ([devastation],[heavy],[light],[flames]) at [AREACOORD(orignator)]")
|
|
message_admins("[key_name_admin(user)] created an explosion ([devastation],[heavy],[light],[flames]) at [AREACOORD(orignator)]")
|
|
BLACKBOX_LOG_ADMIN_VERB("Explosion")
|
|
|
|
ADMIN_VERB(admin_emp, R_ADMIN|R_FUN, "EM Pulse", ADMIN_VERB_NO_DESCRIPTION, ADMIN_CATEGORY_HIDDEN, atom/orignator as obj|mob|turf)
|
|
var/heavy = input(user, "Range of heavy pulse.", "Input") as num|null
|
|
if(heavy == null)
|
|
return
|
|
var/light = input(user, "Range of light pulse.", "Input") as num|null
|
|
if(light == null)
|
|
return
|
|
|
|
if (heavy || light)
|
|
empulse(orignator, heavy, light)
|
|
log_admin("[key_name(user)] created an EM Pulse ([heavy],[light]) at [AREACOORD(orignator)]")
|
|
message_admins("[key_name_admin(user)] created an EM Pulse ([heavy],[light]) at [AREACOORD(orignator)]")
|
|
BLACKBOX_LOG_ADMIN_VERB("EM Pulse")
|
|
|
|
ADMIN_VERB(gib_them, R_ADMIN, "Gib", ADMIN_VERB_NO_DESCRIPTION, ADMIN_CATEGORY_HIDDEN, mob/victim in GLOB.mob_list)
|
|
var/confirm = tgui_alert(user, "Drop a brain?", "Confirm", list("Yes", "No","Cancel")) || "Cancel"
|
|
if(confirm == "Cancel")
|
|
return
|
|
//Due to the delay here its easy for something to have happened to the mob
|
|
if(isnull(victim))
|
|
return
|
|
|
|
log_admin("[key_name(user)] has gibbed [key_name(victim)]")
|
|
message_admins("[key_name_admin(user)] has gibbed [key_name_admin(victim)]")
|
|
|
|
if(isobserver(victim))
|
|
new /obj/effect/gibspawner/generic(get_turf(victim))
|
|
return
|
|
|
|
var/mob/living/living_victim = victim
|
|
if (istype(living_victim))
|
|
living_victim.investigate_log("has been gibbed by an admin.", INVESTIGATE_DEATHS)
|
|
if(confirm == "Yes")
|
|
living_victim.gib(DROP_ALL_REMAINS)
|
|
else
|
|
living_victim.gib(DROP_ORGANS|DROP_BODYPARTS)
|
|
|
|
BLACKBOX_LOG_ADMIN_VERB("Gib")
|
|
|
|
ADMIN_VERB(gib_self, R_ADMIN, "Gibself", "Give yourself the same treatment you give others.", ADMIN_CATEGORY_FUN)
|
|
var/confirm = tgui_alert(user, "You sure?", "Confirm", list("Yes", "No"))
|
|
if(confirm != "Yes")
|
|
return
|
|
log_admin("[key_name(user)] used gibself.")
|
|
message_admins(span_adminnotice("[key_name_admin(user)] used gibself."))
|
|
BLACKBOX_LOG_ADMIN_VERB("Gib Self")
|
|
|
|
var/mob/living/ourself = user.mob
|
|
if (istype(ourself))
|
|
ourself.gib()
|
|
|
|
ADMIN_VERB(everyone_random, R_SERVER, "Make Everyone Random", "Make everyone have a random appearance.", ADMIN_CATEGORY_FUN)
|
|
if(SSticker.HasRoundStarted())
|
|
to_chat(user, "Nope you can't do this, the game's already started. This only works before rounds!", confidential = TRUE)
|
|
return
|
|
|
|
var/frn = CONFIG_GET(flag/force_random_names)
|
|
if(frn)
|
|
CONFIG_SET(flag/force_random_names, FALSE)
|
|
message_admins("Admin [key_name_admin(user)] has disabled \"Everyone is Special\" mode.")
|
|
to_chat(user, "Disabled.", confidential = TRUE)
|
|
return
|
|
|
|
var/notifyplayers = tgui_alert(user, "Do you want to notify the players?", "Options", list("Yes", "No", "Cancel")) || "Cancel"
|
|
if(notifyplayers == "Cancel")
|
|
return
|
|
|
|
log_admin("Admin [key_name(user)] has forced the players to have random appearances.")
|
|
message_admins("Admin [key_name_admin(user)] has forced the players to have random appearances.")
|
|
|
|
if(notifyplayers == "Yes")
|
|
to_chat(world, span_adminnotice("Admin [user.key] has forced the players to have completely random identities!"), confidential = TRUE)
|
|
|
|
to_chat(user, "<i>Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet</i>.", confidential = TRUE)
|
|
|
|
CONFIG_SET(flag/force_random_names, TRUE)
|
|
BLACKBOX_LOG_ADMIN_VERB("Make Everyone Random")
|
|
|
|
ADMIN_VERB(mass_zombie_infection, R_ADMIN, "Mass Zombie Infection", "Infects all humans with a latent organ that will zombify them on death.", ADMIN_CATEGORY_FUN)
|
|
var/confirm = tgui_alert(user, "Please confirm you want to add latent zombie organs in all humans?", "Confirm Zombies", list("Yes", "No"))
|
|
if(confirm != "Yes")
|
|
return
|
|
|
|
for(var/i in GLOB.human_list)
|
|
var/mob/living/carbon/human/H = i
|
|
new /obj/item/organ/zombie_infection/nodamage(H)
|
|
|
|
message_admins("[key_name_admin(user)] added a latent zombie infection to all humans.")
|
|
log_admin("[key_name(user)] added a latent zombie infection to all humans.")
|
|
BLACKBOX_LOG_ADMIN_VERB("Mass Zombie Infection")
|
|
|
|
ADMIN_VERB(mass_zombie_cure, R_ADMIN, "Mass Zombie Cure", "Removes the zombie infection from all humans, returning them to normal.", ADMIN_CATEGORY_FUN)
|
|
var/confirm = tgui_alert(user, "Please confirm you want to cure all zombies?", "Confirm Zombie Cure", list("Yes", "No"))
|
|
if(confirm != "Yes")
|
|
return
|
|
|
|
for(var/obj/item/organ/zombie_infection/nodamage/I in GLOB.zombie_infection_list)
|
|
qdel(I)
|
|
|
|
message_admins("[key_name_admin(user)] cured all zombies.")
|
|
log_admin("[key_name(user)] cured all zombies.")
|
|
BLACKBOX_LOG_ADMIN_VERB("Mass Zombie Cure")
|
|
|
|
ADMIN_VERB(polymorph_all, R_ADMIN, "Polymorph All", "Applies the effects of the bolt of change to every single mob.", ADMIN_CATEGORY_FUN)
|
|
var/confirm = tgui_alert(user, "Please confirm you want polymorph all mobs?", "Confirm Polymorph", list("Yes", "No"))
|
|
if(confirm != "Yes")
|
|
return
|
|
|
|
var/list/mobs = shuffle(GLOB.alive_mob_list.Copy()) // might change while iterating
|
|
var/who_did_it = key_name_admin(user)
|
|
|
|
message_admins("[key_name_admin(user)] started polymorphed all living mobs.")
|
|
log_admin("[key_name(user)] polymorphed all living mobs.")
|
|
BLACKBOX_LOG_ADMIN_VERB("Polymorph All")
|
|
|
|
for(var/mob/living/M in mobs)
|
|
CHECK_TICK
|
|
|
|
if(!M)
|
|
continue
|
|
|
|
M.audible_message(span_hear("...wabbajack...wabbajack..."))
|
|
playsound(M.loc, 'sound/effects/magic/staff_change.ogg', 50, TRUE, -1)
|
|
|
|
M.wabbajack()
|
|
|
|
message_admins("Mass polymorph started by [who_did_it] is complete.")
|
|
|
|
ADMIN_VERB_AND_CONTEXT_MENU(admin_smite, R_ADMIN|R_FUN, "Smite", "Smite a player with divine power.", ADMIN_CATEGORY_FUN, mob/living/target in world)
|
|
var/punishment = tgui_input_list(user, "Choose a punishment", "DIVINE SMITING", GLOB.smites)
|
|
|
|
if(QDELETED(target) || !punishment)
|
|
return
|
|
|
|
var/smite_path = GLOB.smites[punishment]
|
|
var/datum/smite/smite = new smite_path
|
|
var/configuration_success = smite.configure(user)
|
|
if (configuration_success == FALSE)
|
|
return
|
|
smite.effect(user, target)
|
|
|
|
/// "Turns" people into objects. Really, we just add them to the contents of the item.
|
|
/proc/objectify(atom/movable/target, path_or_instance)
|
|
var/atom/tomb
|
|
if(ispath(path_or_instance))
|
|
tomb = new path_or_instance(get_turf(target))
|
|
else
|
|
tomb = path_or_instance
|
|
target.forceMove(tomb)
|
|
target.AddComponent(/datum/component/itembound, tomb)
|
|
|
|
/**
|
|
* firing_squad is a proc for the :B:erforate smite to shoot each individual bullet at them, so that we can add actual delays without sleep() nonsense
|
|
*
|
|
* Hilariously, if you drag someone away mid smite, the bullets will still chase after them from the original spot, possibly hitting other people. Too funny to fix imo
|
|
*
|
|
* Arguments:
|
|
* * target- guy we're shooting obviously
|
|
* * source_turf- where the bullet begins, preferably on a turf next to the target
|
|
* * body_zone- which bodypart we're aiming for, if there is one there
|
|
* * wound_bonus- the wounding power we're assigning to the bullet, since we don't care about the base one
|
|
* * damage- the damage we're assigning to the bullet, since we don't care about the base one
|
|
*/
|
|
/proc/firing_squad(mob/living/carbon/target, turf/source_turf, body_zone, wound_bonus, damage)
|
|
if(!target.get_bodypart(body_zone))
|
|
return
|
|
playsound(target, 'sound/items/weapons/gun/revolver/shot.ogg', 100)
|
|
var/obj/projectile/bullet/smite/divine_wrath = new(source_turf)
|
|
divine_wrath.damage = damage
|
|
divine_wrath.wound_bonus = wound_bonus
|
|
divine_wrath.original = target
|
|
divine_wrath.def_zone = body_zone
|
|
divine_wrath.spread = 0
|
|
divine_wrath.aim_projectile(target, source_turf)
|
|
divine_wrath.fire()
|
|
|
|
/client/proc/punish_log(whom, punishment)
|
|
var/msg = "[key_name_admin(src)] punished [key_name_admin(whom)] with [punishment]."
|
|
message_admins(msg)
|
|
admin_ticket_log(whom, msg)
|
|
log_admin("[key_name(src)] punished [key_name(whom)] with [punishment].")
|