mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-05 06:21:57 +00:00
## About The Pull Request If the station rolls the "Cargo Gorilla" trait, a button will now be visible on the lobby. Clicking on this button before the round has started will add you to a list of participants, one of whom will be selected to become a gorilla when the round begins. If nobody signs up (because they're really boring I guess) the job will instead appear on the latejoin menu. Once someone has become the gorilla the button will disappear.  While implementing this I noticed that an inverted check means we were never populating the "GLOB.cargo_sloth" field which means the station trait wasn't even working. BEHIND THE SCENES This also adds a generic "job station trait" which can be expanded in the future. Future developers can extend this to add other "rare jobs" with relative ease. By default I have made it so all subtypes of this trait are mutually exclusive, only one can roll at a time. This also means that I have converted "cargo gorilla" into a job, which applies most of the code previously located in the mob's typepath or in the station trait. The fact that it is a job means that **admins** can enable any number of gorillas to be present on the latejoin menu (but not the roundstart one, as it is not possible to add Cargo Gorilla to your occupation preferences) if they so desire. The random beurocratic station trait, event, and traitor item (and the job console) are not able to add gorilla slots. Because I changed "Cargo Gorilla" to a job it now no longer exists on the map until a player gains the role, and there wasn't a non-hacky way to copy the name of this round's cargo sloth. Instead I just added a small cargo gorilla name list. ## Why It's Good For The Game Makes the presence of a fun trait more visible to players. Means that people who aren't observing get a chance to be a monkey. This is a framework several other people have wanted to exist for their own features. ## Changelog 🆑 Jacquerel and Fikou qol: If the station rolls the "Cargo Gorilla" station trait. you will be able to sign up for the role from the game lobby. qol: If nobody signs up to be the Cargo Gorilla then you can select it from the Late Join menu and arrive on the arrival shuttle. fix: The Cargo Gorilla will actually spawn. /🆑
129 lines
3.4 KiB
Plaintext
129 lines
3.4 KiB
Plaintext
/*
|
|
Usage:
|
|
- Define mouse event procs on your (probably HUD) object and simply call the show and hide procs respectively:
|
|
/atom/movable/screen/hud
|
|
MouseEntered(location, control, params)
|
|
usr.client.tooltip.show(params, title = src.name, content = src.desc)
|
|
|
|
MouseExited()
|
|
usr.client.tooltip.hide()
|
|
|
|
Customization:
|
|
- Theming can be done by passing the theme var to show() and using css in the html file to change the look
|
|
- For your convenience some pre-made themes are included
|
|
|
|
Notes:
|
|
- You may have noticed 90% of the work is done via javascript on the client. Gotta save those cycles man.
|
|
*/
|
|
|
|
|
|
/datum/tooltip
|
|
var/client/owner
|
|
var/control = "mainwindow.tooltip"
|
|
var/showing = 0
|
|
var/queueHide = 0
|
|
var/init = 0
|
|
var/atom/last_target
|
|
|
|
|
|
/datum/tooltip/New(client/C)
|
|
if (C)
|
|
owner = C
|
|
var/datum/asset/stuff = get_asset_datum(/datum/asset/simple/jquery)
|
|
stuff.send(owner)
|
|
owner << browse(file2text('code/modules/tooltip/tooltip.html'), "window=[control]")
|
|
|
|
..()
|
|
|
|
|
|
/datum/tooltip/proc/show(atom/movable/thing, params = null, title = null, content = null, theme = "default", special = "none")
|
|
if (!thing || !params || (!title && !content) || !owner || !isnum(world.icon_size))
|
|
return FALSE
|
|
|
|
if (!isnull(last_target))
|
|
UnregisterSignal(last_target, COMSIG_QDELETING)
|
|
|
|
RegisterSignal(thing, COMSIG_QDELETING, PROC_REF(on_target_qdel))
|
|
|
|
last_target = thing
|
|
|
|
if (!init)
|
|
//Initialize some vars
|
|
init = 1
|
|
owner << output(list2params(list(world.icon_size, control)), "[control]:tooltip.init")
|
|
|
|
showing = 1
|
|
|
|
if (title && content)
|
|
title = "<h1>[title]</h1>"
|
|
content = "<p>[content]</p>"
|
|
else if (title && !content)
|
|
title = "<p>[title]</p>"
|
|
else if (!title && content)
|
|
content = "<p>[content]</p>"
|
|
|
|
// Strip macros from item names
|
|
title = replacetext(title, "\proper", "")
|
|
title = replacetext(title, "\improper", "")
|
|
|
|
//Make our dumb param object
|
|
params = {"{ "cursor": "[params]", "screenLoc": "[thing.screen_loc]" }"}
|
|
|
|
//Send stuff to the tooltip
|
|
var/view_size = getviewsize(owner.view)
|
|
owner << output(list2params(list(params, view_size[1] , view_size[2], "[title][content]", theme, special)), "[control]:tooltip.update")
|
|
|
|
//If a hide() was hit while we were showing, run hide() again to avoid stuck tooltips
|
|
showing = 0
|
|
if (queueHide)
|
|
hide()
|
|
|
|
return TRUE
|
|
|
|
|
|
/datum/tooltip/proc/hide()
|
|
queueHide = showing ? TRUE : FALSE
|
|
|
|
if (queueHide)
|
|
addtimer(CALLBACK(src, PROC_REF(do_hide)), 1)
|
|
else
|
|
do_hide()
|
|
|
|
return TRUE
|
|
|
|
/datum/tooltip/proc/on_target_qdel()
|
|
SIGNAL_HANDLER
|
|
|
|
INVOKE_ASYNC(src, PROC_REF(hide))
|
|
last_target = null
|
|
|
|
/datum/tooltip/proc/do_hide()
|
|
winshow(owner, control, FALSE)
|
|
|
|
/datum/tooltip/Destroy(force, ...)
|
|
last_target = null
|
|
return ..()
|
|
|
|
//Open a tooltip for user, at a location based on params
|
|
//Theme is a CSS class in tooltip.html, by default this wrapper chooses a CSS class based on the user's UI_style (Midnight, Plasmafire, Retro, etc)
|
|
//Includes sanity.checks
|
|
/proc/openToolTip(mob/user = null, atom/movable/tip_src = null, params = null, title = "", content = "", theme = "")
|
|
if(!istype(user) || !user.client?.tooltips)
|
|
return
|
|
var/ui_style = user.client?.prefs?.read_preference(/datum/preference/choiced/ui_style)
|
|
if(!theme && ui_style)
|
|
theme = lowertext(ui_style)
|
|
if(!theme)
|
|
theme = "default"
|
|
user.client.tooltips.show(tip_src, params, title, content, theme)
|
|
|
|
|
|
//Arbitrarily close a user's tooltip
|
|
//Includes sanity checks.
|
|
/proc/closeToolTip(mob/user)
|
|
if(!istype(user) || !user.client?.tooltips)
|
|
return
|
|
user.client.tooltips.hide()
|
|
|
|
|