Merge pull request #16121 from SandPoot/death

Updates a ton of stuff based on tg
This commit is contained in:
deathride58
2025-02-13 12:30:14 -05:00
committed by GitHub
108 changed files with 1157 additions and 758 deletions

View File

@@ -10,7 +10,7 @@
"**/.pnp.*": true
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
"source.fixAll.eslint": "explicit"
},
"workbench.editorAssociations": {
"*.dmi": "dmiEditor.dmiEditor"

View File

@@ -23,3 +23,5 @@
#define COMPONENT_NO_MOUSEDROP (1<<0)
///from base of atom/MouseDrop_T: (/atom/from, /mob/user)
#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user)
/// From /atom/movable/screen/click(): (atom/target, atom/location, control, params, mob/user)
#define COMSIG_SCREEN_ELEMENT_CLICK "screen_element_click"

View File

@@ -1,2 +1,5 @@
/// a person somewhere has thrown something : (mob/living/carbon/carbon_thrower, target)
#define COMSIG_GLOB_CARBON_THROW_THING "!throw_thing"
/// Global signal sent before we decide what job everyone has
#define COMSIG_GLOB_PRE_JOBS_ASSIGNED "!pre_roles_assigned"

View File

@@ -2,3 +2,5 @@
#define COMSIG_HUD_LOBBY_COLLAPSED "hud_lobby_collapsed"
/// Sent from /atom/movable/screen/lobby/button/collapse/proc/expand_buttons() : ()
#define COMSIG_HUD_LOBBY_EXPANDED "hud_lobby_expanded"
/// Sent from /atom/movable/screen/lobby/button/ready/Click() : ()
#define COMSIG_HUD_PLAYER_READY_TOGGLE "hud_player_ready_toggle"

View File

@@ -4,10 +4,21 @@
#define LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD 8
// LANGUAGE SOURCE DEFINES
#define LANGUAGE_ALL "all" // For use in full removal only.
#define LANGUAGE_ATOM "atom"
#define LANGUAGE_MIND "mind"
/// For use in full removal only.
#define LANGUAGE_ALL "all"
// Generic language sources.
/// Language is linked to the movable directly.
#define LANGUAGE_ATOM "atom"
/// Language is linked to the mob's mind.
/// If a mind transfer happens, language follows.
#define LANGUAGE_MIND "mind"
/// Language is linked to the mob's species.
/// If a species change happens, language goes away.
/// If applied to a non-human (no species) atom, this is effectively the same as [LANGUAGE_ATOM].
#define LANGUAGE_SPECIES "species"
// More specific language sources.
// Only ever goes away when dismissed directly.
#define LANGUAGE_ABSORB "absorb"
#define LANGUAGE_APHASIA "aphasia"
#define LANGUAGE_BLOODSUCKER "bloodsucker"
@@ -25,3 +36,9 @@
#define LANGUAGE_VASSAL "vassal"
#define LANGUAGE_VOICECHANGE "voicechange"
#define LANGUAGE_MULTILINGUAL "multilingual"
// Language flags. Used in granting and removing languages.
/// This language can be spoken.
#define SPOKEN_LANGUAGE (1<<0)
/// This language can be understood.
#define UNDERSTOOD_LANGUAGE (1<<1)

View File

@@ -743,6 +743,13 @@
else
L1[key] = other_value
/// Turns an associative list into a flat list of keys
/proc/assoc_to_keys(list/input)
var/list/keys = list()
for(var/key in input)
UNTYPED_LIST_ADD(keys, key)
return keys
/proc/assoc_list_strip_value(list/input)
var/list/ret = list()
for(var/key in input)

View File

@@ -194,109 +194,91 @@
var/atom/movable/screen/using
// Language menu
using = new /atom/movable/screen/language_menu
using = new /atom/movable/screen/language_menu(null, src)
using.screen_loc = ui_ai_language_menu
using.hud = src
static_inventory += using
//AI core
using = new /atom/movable/screen/ai/aicore()
using = new /atom/movable/screen/ai/aicore(null, src)
using.screen_loc = ui_ai_core
using.hud = src
static_inventory += using
//Camera list
using = new /atom/movable/screen/ai/camera_list()
using = new /atom/movable/screen/ai/camera_list(null, src)
using.screen_loc = ui_ai_camera_list
using.hud = src
static_inventory += using
//Track
using = new /atom/movable/screen/ai/camera_track()
using = new /atom/movable/screen/ai/camera_track(null, src)
using.screen_loc = ui_ai_track_with_camera
using.hud = src
static_inventory += using
//Camera light
using = new /atom/movable/screen/ai/camera_light()
using = new /atom/movable/screen/ai/camera_light(null, src)
using.screen_loc = ui_ai_camera_light
using.hud = src
static_inventory += using
//Crew Monitoring
using = new /atom/movable/screen/ai/crew_monitor()
using = new /atom/movable/screen/ai/crew_monitor(null, src)
using.screen_loc = ui_ai_crew_monitor
using.hud = src
static_inventory += using
//Crew Manifest
using = new /atom/movable/screen/ai/crew_manifest()
using = new /atom/movable/screen/ai/crew_manifest(null, src)
using.screen_loc = ui_ai_crew_manifest
using.hud = src
static_inventory += using
//Alerts
using = new /atom/movable/screen/ai/alerts()
using = new /atom/movable/screen/ai/alerts(null, src)
using.screen_loc = ui_ai_alerts
using.hud = src
static_inventory += using
//Announcement
using = new /atom/movable/screen/ai/announcement()
using = new /atom/movable/screen/ai/announcement(null, src)
using.screen_loc = ui_ai_announcement
using.hud = src
static_inventory += using
//Shuttle
using = new /atom/movable/screen/ai/call_shuttle()
using = new /atom/movable/screen/ai/call_shuttle(null, src)
using.screen_loc = ui_ai_shuttle
using.hud = src
static_inventory += using
//Laws
using = new /atom/movable/screen/ai/state_laws()
using = new /atom/movable/screen/ai/state_laws(null, src)
using.screen_loc = ui_ai_state_laws
using.hud = src
static_inventory += using
//PDA message
using = new /atom/movable/screen/ai/pda_msg_send()
using = new /atom/movable/screen/ai/pda_msg_send(null, src)
using.screen_loc = ui_ai_pda_send
using.hud = src
static_inventory += using
//PDA log
using = new /atom/movable/screen/ai/pda_msg_show()
using = new /atom/movable/screen/ai/pda_msg_show(null, src)
using.screen_loc = ui_ai_pda_log
using.hud = src
static_inventory += using
//Take image
using = new /atom/movable/screen/ai/image_take()
using = new /atom/movable/screen/ai/image_take(null, src)
using.screen_loc = ui_ai_take_picture
using.hud = src
static_inventory += using
//View images
using = new /atom/movable/screen/ai/image_view()
using = new /atom/movable/screen/ai/image_view(null, src)
using.screen_loc = ui_ai_view_images
using.hud = src
static_inventory += using
//Medical/Security sensors
using = new /atom/movable/screen/ai/sensors()
using = new /atom/movable/screen/ai/sensors(null, src)
using.screen_loc = ui_ai_sensor
using.hud = src
static_inventory += using
//Multicamera mode
using = new /atom/movable/screen/ai/multicam()
using = new /atom/movable/screen/ai/multicam(null, src)
using.screen_loc = ui_ai_multicam
using.hud = src
static_inventory += using
//Add multicamera camera
using = new /atom/movable/screen/ai/add_multicam()
using = new /atom/movable/screen/ai/add_multicam(null, src)
using.screen_loc = ui_ai_add_multicam
using.hud = src
static_inventory += using

View File

@@ -259,10 +259,10 @@ or something covering your eyes."
var/command
/atom/movable/screen/alert/mind_control/Click()
var/mob/living/L = usr
if(L != owner)
. = ..()
if(!.)
return
to_chat(L, "<span class='mind_control'>[command]</span>")
to_chat(usr, "<span class='mind_control'>[command]</span>")
/atom/movable/screen/alert/hypnosis
name = "Hypnosis"
@@ -283,9 +283,13 @@ If you're feeling frisky, examine yourself and click the underlined item to pull
clickable_glow = TRUE
/atom/movable/screen/alert/embeddedobject/Click()
if(isliving(usr) && usr == owner)
var/mob/living/carbon/M = usr
return M.help_shake_act(M)
. = ..()
if(!.)
return
if(!isliving(usr))
return
var/mob/living/carbon/M = usr
return M.help_shake_act(M)
/atom/movable/screen/alert/weightless
name = "Weightless"
@@ -312,8 +316,11 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
clickable_glow = TRUE
/atom/movable/screen/alert/fire/Click()
. = ..()
if(!.)
return
var/mob/living/L = usr
if(!istype(L) || !L.can_resist() || L != owner)
if(!istype(L) || !L.can_resist())
return
L.MarkResistTime()
if(CHECK_MOBILITY(L, MOBILITY_MOVE))
@@ -721,14 +728,16 @@ so as to remain in compliance with the most up-to-date laws."
var/atom/target = null
/atom/movable/screen/alert/hackingapc/Click()
if(!usr || !usr.client || usr != owner)
. = ..()
if(!.)
return
if(!target)
return
var/mob/living/silicon/ai/AI = usr
var/turf/T = get_turf(target)
if(T)
AI.eyeobj.setLoc(T)
if(!T)
return
AI.eyeobj.setLoc(T)
//MECHS
@@ -748,10 +757,11 @@ so as to remain in compliance with the most up-to-date laws."
clickable_glow = TRUE
/atom/movable/screen/alert/notify_cloning/Click()
if(!usr || !usr.client || usr != owner)
. = ..()
if(!.)
return
var/mob/dead/observer/G = usr
G.reenter_corpse()
var/mob/dead/observer/dead_owner = usr
dead_owner.reenter_corpse()
/atom/movable/screen/alert/notify_action
name = "Body created"
@@ -763,8 +773,10 @@ so as to remain in compliance with the most up-to-date laws."
var/action = NOTIFY_JUMP
/atom/movable/screen/alert/notify_action/Click()
if(!usr || !usr.client || usr != owner)
. = ..()
if(!.)
return
if(!target)
return
var/mob/dead/observer/G = usr
@@ -782,32 +794,43 @@ so as to remain in compliance with the most up-to-date laws."
//OBJECT-BASED
/atom/movable/screen/alert/restrained
clickable_glow = TRUE
/atom/movable/screen/alert/restrained/buckled
/atom/movable/screen/alert/buckled
name = "Buckled"
desc = "You've been buckled to something. Click the alert to unbuckle unless you're handcuffed."
icon_state = "buckled"
clickable_glow = TRUE
/atom/movable/screen/alert/restrained
clickable_glow = TRUE
/atom/movable/screen/alert/restrained/handcuffed
name = "Handcuffed"
desc = "You're handcuffed and can't act. If anyone drags you, you won't be able to move. Click the alert to free yourself."
click_master = FALSE
/atom/movable/screen/alert/restrained/legcuffed
name = "Legcuffed"
desc = "You're legcuffed, which slows you down considerably. Click the alert to free yourself."
click_master = FALSE
/atom/movable/screen/alert/restrained/Click()
. = ..()
if(!.)
return
var/mob/living/L = usr
if(!istype(L) || !L.can_resist() || L != owner)
if(!istype(L) || !L.can_resist())
return
L.MarkResistTime()
return L.resist_restraints()
/atom/movable/screen/alert/restrained/buckled/Click()
/atom/movable/screen/alert/buckled/Click()
. = ..()
if(!.)
return
var/mob/living/L = usr
if(!istype(L) || !L.can_resist() || L != owner)
if(!istype(L) || !L.can_resist())
return
L.MarkResistTime()
return L.resist_buckle()
@@ -824,8 +847,11 @@ so as to remain in compliance with the most up-to-date laws."
clickable_glow = TRUE
/atom/movable/screen/alert/shoes/Click()
. = ..()
if(!.)
return
var/mob/living/carbon/C = usr
if(!istype(C) || !C.can_resist() || C != owner || !C.shoes)
if(!istype(C) || !C.can_resist() || !C.shoes)
return
C.MarkResistTime()
C.shoes.handle_tying(C)

View File

@@ -39,84 +39,71 @@
//begin buttons
using = new /atom/movable/screen/swap_hand()
using = new /atom/movable/screen/swap_hand(null, src)
using.icon = ui_style
using.icon_state = "swap_1"
using.screen_loc = ui_swaphand_position(owner,1)
using.hud = src
static_inventory += using
using = new /atom/movable/screen/swap_hand()
using = new /atom/movable/screen/swap_hand(null, src)
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand_position(owner,2)
using.hud = src
static_inventory += using
action_intent = new /atom/movable/screen/act_intent/alien()
action_intent = new /atom/movable/screen/act_intent/alien(null, src)
action_intent.icon_state = mymob.a_intent
action_intent.hud = src
static_inventory += action_intent
if(isalienhunter(mymob))
var/mob/living/carbon/alien/humanoid/hunter/H = mymob
H.leap_icon = new /atom/movable/screen/alien/leap()
H.leap_icon = new /atom/movable/screen/alien/leap(null, src)
H.leap_icon.screen_loc = ui_alien_storage_r
static_inventory += H.leap_icon
using = new/atom/movable/screen/language_menu
using = new/atom/movable/screen/language_menu(null, src)
using.screen_loc = ui_alien_language_menu
using.hud = src
static_inventory += using
using = new /atom/movable/screen/drop()
using = new /atom/movable/screen/drop(null, src)
using.icon = ui_style
using.screen_loc = ui_drop_throw
using.hud = src
static_inventory += using
using = new /atom/movable/screen/resist()
using = new /atom/movable/screen/resist(null, src)
using.icon = ui_style
using.screen_loc = ui_pull_resist
using.hud = src
hotkeybuttons += using
throw_icon = new /atom/movable/screen/throw_catch()
throw_icon = new /atom/movable/screen/throw_catch(null, src)
throw_icon.icon = ui_style
throw_icon.screen_loc = ui_drop_throw
throw_icon.hud = src
hotkeybuttons += throw_icon
pull_icon = new /atom/movable/screen/pull()
pull_icon = new /atom/movable/screen/pull(null, src)
pull_icon.icon = ui_style
pull_icon.hud = src
pull_icon.update_icon()
pull_icon.screen_loc = ui_pull_resist
static_inventory += pull_icon
//begin indicators
healths = new /atom/movable/screen/healths/alien()
healths.hud = src
healths = new /atom/movable/screen/healths/alien(null, src)
infodisplay += healths
alien_plasma_display = new /atom/movable/screen/alien/plasma_display()
alien_plasma_display.hud = src
alien_plasma_display = new /atom/movable/screen/alien/plasma_display(null, src)
infodisplay += alien_plasma_display
if(!isalienqueen(mymob))
alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder
alien_queen_finder.hud = src
alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder(null, src)
infodisplay += alien_queen_finder
zone_select = new /atom/movable/screen/zone_sel/alien()
zone_select.hud = src
zone_select = new /atom/movable/screen/zone_sel/alien(null, src)
zone_select.update_icon()
static_inventory += zone_select
for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv
inv.update_icon()

View File

@@ -5,32 +5,26 @@
..()
var/atom/movable/screen/using
action_intent = new /atom/movable/screen/act_intent/alien()
action_intent = new /atom/movable/screen/act_intent/alien(null, src)
action_intent.icon_state = mymob.a_intent
action_intent.hud = src
static_inventory += action_intent
healths = new /atom/movable/screen/healths/alien()
healths.hud = src
healths = new /atom/movable/screen/healths/alien(null, src)
infodisplay += healths
alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder()
alien_queen_finder.hud = src
alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder(null, src)
infodisplay += alien_queen_finder
pull_icon = new /atom/movable/screen/pull()
pull_icon = new /atom/movable/screen/pull(null, src)
pull_icon.icon = 'icons/mob/screen_alien.dmi'
pull_icon.hud = src
pull_icon.update_icon()
pull_icon.screen_loc = ui_pull_resist
hotkeybuttons += pull_icon
using = new/atom/movable/screen/language_menu
using = new/atom/movable/screen/language_menu(null, src)
using.screen_loc = ui_alien_language_menu
using.hud = src
static_inventory += using
zone_select = new /atom/movable/screen/zone_sel/alien()
zone_select.hud = src
zone_select = new /atom/movable/screen/zone_sel/alien(null, src)
zone_select.update_icon()
static_inventory += zone_select

View File

@@ -127,61 +127,50 @@
..()
var/atom/movable/screen/using
blobpwrdisplay = new /atom/movable/screen()
blobpwrdisplay = new /atom/movable/screen(null, src)
blobpwrdisplay.name = "blob power"
blobpwrdisplay.icon_state = "block"
blobpwrdisplay.screen_loc = ui_health
blobpwrdisplay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
blobpwrdisplay.layer = ABOVE_HUD_LAYER
blobpwrdisplay.plane = ABOVE_HUD_PLANE
blobpwrdisplay.hud = src
infodisplay += blobpwrdisplay
healths = new /atom/movable/screen/healths/blob()
healths.hud = src
healths = new /atom/movable/screen/healths/blob(null, src)
infodisplay += healths
using = new /atom/movable/screen/blob/BlobHelp()
using = new /atom/movable/screen/blob/BlobHelp(null, src)
using.screen_loc = "WEST:6,NORTH:-3"
using.hud = src
static_inventory += using
using = new /atom/movable/screen/blob/JumpToNode()
using = new /atom/movable/screen/blob/JumpToNode(null, src)
using.screen_loc = ui_inventory
using.hud = src
static_inventory += using
using = new /atom/movable/screen/blob/JumpToCore()
using = new /atom/movable/screen/blob/JumpToCore(null, src)
using.screen_loc = ui_zonesel
using.hud = src
static_inventory += using
using = new /atom/movable/screen/blob/Blobbernaut()
using = new /atom/movable/screen/blob/Blobbernaut(null, src)
using.screen_loc = ui_belt
using.hud = src
static_inventory += using
using = new /atom/movable/screen/blob/ResourceBlob()
using = new /atom/movable/screen/blob/ResourceBlob(null, src)
using.screen_loc = ui_back
using.hud = src
static_inventory += using
using = new /atom/movable/screen/blob/NodeBlob()
using = new /atom/movable/screen/blob/NodeBlob(null, src)
using.screen_loc = ui_hand_position(2)
using.hud = src
static_inventory += using
using = new /atom/movable/screen/blob/FactoryBlob()
using = new /atom/movable/screen/blob/FactoryBlob(null, src)
using.screen_loc = ui_hand_position(1)
using.hud = src
static_inventory += using
using = new /atom/movable/screen/blob/ReadaptStrain()
using = new /atom/movable/screen/blob/ReadaptStrain(null, src)
using.screen_loc = ui_storage1
using.hud = src
static_inventory += using
using = new /atom/movable/screen/blob/RelocateCore()
using = new /atom/movable/screen/blob/RelocateCore(null, src)
using.screen_loc = ui_storage2
using.hud = src
static_inventory += using

View File

@@ -2,10 +2,8 @@
/datum/hud/blobbernaut/New(mob/owner)
..()
blobpwrdisplay = new /atom/movable/screen/healths/blob/naut/core()
blobpwrdisplay.hud = src
blobpwrdisplay = new /atom/movable/screen/healths/blob/naut/core(null, src)
infodisplay += blobpwrdisplay
healths = new /atom/movable/screen/healths/blob/naut()
healths.hud = src
healths = new /atom/movable/screen/healths/blob/naut(null, src)
infodisplay += healths

View File

@@ -7,14 +7,14 @@
..()
var/atom/movable/screen/using
healths = new /atom/movable/screen/healths/clock()
healths = new /atom/movable/screen/healths/clock(null, src)
infodisplay += healths
hosthealth = new /atom/movable/screen/healths/clock()
hosthealth = new /atom/movable/screen/healths/clock(null, src)
hosthealth.screen_loc = ui_internal
infodisplay += hosthealth
using = new /atom/movable/screen/marauder/emerge()
using = new /atom/movable/screen/marauder/emerge(null, src)
using.screen_loc = ui_zonesel
static_inventory += using

View File

@@ -3,13 +3,11 @@
/datum/hud/constructs/New(mob/owner)
..()
pull_icon = new /atom/movable/screen/pull()
pull_icon = new /atom/movable/screen/pull(null, src)
pull_icon.icon = ui_style
pull_icon.hud = src
pull_icon.update_icon()
pull_icon.screen_loc = ui_construct_pull
static_inventory += pull_icon
healths = new /atom/movable/screen/healths/construct()
healths.hud = src
healths = new /atom/movable/screen/healths/construct(null, src)
infodisplay += healths

View File

@@ -6,51 +6,44 @@
..()
var/atom/movable/screen/using
using = new /atom/movable/screen/drop()
using = new /atom/movable/screen/drop(null, src)
using.icon = ui_style
using.screen_loc = ui_drone_drop
using.hud = src
static_inventory += using
pull_icon = new /atom/movable/screen/pull()
pull_icon = new /atom/movable/screen/pull(null, src)
pull_icon.icon = ui_style
pull_icon.hud = src
pull_icon.update_icon()
pull_icon.screen_loc = ui_drone_pull
static_inventory += pull_icon
build_hand_slots()
using = new /atom/movable/screen/inventory()
using = new /atom/movable/screen/inventory(null, src)
using.name = "hand"
using.icon = ui_style
using.icon_state = "swap_1_m"
using.screen_loc = ui_swaphand_position(owner,1)
using.layer = HUD_LAYER
using.plane = HUD_PLANE
using.hud = src
static_inventory += using
using = new /atom/movable/screen/inventory()
using = new /atom/movable/screen/inventory(null, src)
using.name = "hand"
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand_position(owner,2)
using.layer = HUD_LAYER
using.plane = HUD_PLANE
using.hud = src
static_inventory += using
zone_select = new /atom/movable/screen/zone_sel()
zone_select = new /atom/movable/screen/zone_sel(null, src)
zone_select.icon = ui_style
zone_select.hud = src
zone_select.update_icon()
lingchemdisplay = new /atom/movable/screen/ling/chems()
lingchemdisplay.hud = src
lingchemdisplay = new /atom/movable/screen/ling/chems(null, src)
devilsouldisplay = new /atom/movable/screen/devil/soul_counter
devilsouldisplay.hud = src
devilsouldisplay = new /atom/movable/screen/devil/soul_counter(null, src)
infodisplay += devilsouldisplay

View File

@@ -2,7 +2,7 @@
..()
var/atom/movable/screen/inventory/inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "internal storage"
inv_box.icon = ui_style
inv_box.icon_state = "suit_storage"
@@ -11,7 +11,7 @@
inv_box.slot_id = ITEM_SLOT_DEX_STORAGE
static_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "head/mask"
inv_box.icon = ui_style
inv_box.icon_state = "mask"
@@ -22,7 +22,6 @@
for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv
inv.update_icon()

View File

@@ -9,9 +9,6 @@
/// Boolean, have the cops arrived? If so, the icon stops changing and remains the same.
var/cops_arrived = 0
/atom/movable/screen/wanted/New()
return ..()
/atom/movable/screen/wanted/Initialize(mapload)
. = ..()
update_icon()

View File

@@ -3,63 +3,55 @@
..()
var/atom/movable/screen/using
using = new /atom/movable/screen/drop()
using = new /atom/movable/screen/drop(null, src)
using.icon = ui_style
using.screen_loc = ui_drone_drop
using.hud = src
static_inventory += using
pull_icon = new /atom/movable/screen/pull()
pull_icon = new /atom/movable/screen/pull(null, src)
pull_icon.icon = ui_style
pull_icon.hud = src
pull_icon.update_icon()
pull_icon.screen_loc = ui_drone_pull
static_inventory += pull_icon
build_hand_slots()
using = new /atom/movable/screen/swap_hand()
using = new /atom/movable/screen/swap_hand(null, src)
using.icon = ui_style
using.icon_state = "swap_1_m"
using.screen_loc = ui_swaphand_position(owner,1)
using.hud = src
static_inventory += using
using = new /atom/movable/screen/swap_hand()
using = new /atom/movable/screen/swap_hand(null, src)
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand_position(owner,2)
using.hud = src
static_inventory += using
if(mymob.possible_a_intents)
if(mymob.possible_a_intents.len == 4)
// All possible intents - full intent selector
action_intent = new /atom/movable/screen/act_intent/segmented
action_intent = new /atom/movable/screen/act_intent/segmented(null, src)
else
action_intent = new /atom/movable/screen/act_intent
action_intent = new /atom/movable/screen/act_intent(null, src)
action_intent.icon = ui_style
action_intent.icon_state = mymob.a_intent
action_intent.hud = src
static_inventory += action_intent
zone_select = new /atom/movable/screen/zone_sel()
zone_select = new /atom/movable/screen/zone_sel(null, src)
zone_select.icon = ui_style
zone_select.hud = src
zone_select.update_icon()
static_inventory += zone_select
using = new /atom/movable/screen/area_creator
using = new /atom/movable/screen/area_creator(null, src)
using.icon = ui_style
using.hud = src
static_inventory += using
mymob.client.screen = list()
for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv
inv.update_icon()

View File

@@ -49,34 +49,28 @@
..()
var/atom/movable/screen/using
using = new /atom/movable/screen/ghost/jumptomob()
using = new /atom/movable/screen/ghost/jumptomob(null, src)
using.screen_loc = ui_ghost_jumptomob
using.hud = src
static_inventory += using
using = new /atom/movable/screen/ghost/orbit()
using = new /atom/movable/screen/ghost/orbit(null, src)
using.screen_loc = ui_ghost_orbit
using.hud = src
static_inventory += using
using = new /atom/movable/screen/ghost/reenter_corpse()
using = new /atom/movable/screen/ghost/reenter_corpse(null, src)
using.screen_loc = ui_ghost_reenter_corpse
using.hud = src
static_inventory += using
using = new /atom/movable/screen/ghost/teleport()
using = new /atom/movable/screen/ghost/teleport(null, src)
using.screen_loc = ui_ghost_teleport
using.hud = src
static_inventory += using
using = new /atom/movable/screen/ghost/spawners()
using = new /atom/movable/screen/ghost/spawners(null, src)
using.screen_loc = ui_ghost_spawners
using.hud = src
static_inventory += using
using = new /atom/movable/screen/language_menu
using = new /atom/movable/screen/language_menu(null, src)
using.icon = ui_style
using.hud = src
static_inventory += using
/datum/hud/ghost/show_hud(version = 0, mob/viewmob)

View File

@@ -3,33 +3,27 @@
..()
var/atom/movable/screen/using
healths = new /atom/movable/screen/healths/guardian()
healths.hud = src
healths = new /atom/movable/screen/healths/guardian(null, src)
infodisplay += healths
using = new /atom/movable/screen/guardian/Manifest()
using = new /atom/movable/screen/guardian/Manifest(null, src)
using.screen_loc = ui_hand_position(2)
using.hud = src
static_inventory += using
using = new /atom/movable/screen/guardian/Recall()
using = new /atom/movable/screen/guardian/Recall(null, src)
using.screen_loc = ui_hand_position(1)
using.hud = src
static_inventory += using
using = new owner.toggle_button_type()
using = new owner.toggle_button_type(null, src)
using.screen_loc = ui_storage1
using.hud = src
static_inventory += using
using = new /atom/movable/screen/guardian/ToggleLight()
using = new /atom/movable/screen/guardian/ToggleLight(null, src)
using.screen_loc = ui_inventory
using.hud = src
static_inventory += using
using = new /atom/movable/screen/guardian/Communicate()
using = new /atom/movable/screen/guardian/Communicate(null, src)
using.screen_loc = ui_back
using.hud = src
static_inventory += using
/datum/hud/dextrous/guardian/New(mob/living/simple_animal/hostile/guardian/owner) //for a dextrous guardian
@@ -38,7 +32,7 @@
if(istype(owner, /mob/living/simple_animal/hostile/guardian/dextrous))
var/atom/movable/screen/inventory/inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "internal storage"
inv_box.icon = ui_style
inv_box.icon_state = "suit_storage"
@@ -46,32 +40,32 @@
inv_box.slot_id = ITEM_SLOT_DEX_STORAGE
static_inventory += inv_box
using = new /atom/movable/screen/guardian/Communicate()
using = new /atom/movable/screen/guardian/Communicate(null, src)
using.screen_loc = ui_sstore1
static_inventory += using
else
using = new /atom/movable/screen/guardian/Communicate()
using = new /atom/movable/screen/guardian/Communicate(null, src)
using.screen_loc = ui_id
static_inventory += using
healths = new /atom/movable/screen/healths/guardian()
healths = new /atom/movable/screen/healths/guardian(null, src)
infodisplay += healths
using = new /atom/movable/screen/guardian/Manifest()
using = new /atom/movable/screen/guardian/Manifest(null, src)
using.screen_loc = ui_belt
static_inventory += using
using = new /atom/movable/screen/guardian/Recall()
using = new /atom/movable/screen/guardian/Recall(null, src)
using.screen_loc = ui_back
static_inventory += using
using = new owner.toggle_button_type()
using = new owner.toggle_button_type(null, src)
using.screen_loc = ui_storage2
static_inventory += using
using = new /atom/movable/screen/guardian/ToggleLight()
using = new /atom/movable/screen/guardian/ToggleLight(null, src)
using.screen_loc = ui_inventory
static_inventory += using

View File

@@ -109,12 +109,12 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
hand_slots = list()
for(var/mytype in subtypesof(/atom/movable/screen/plane_master))
var/atom/movable/screen/plane_master/instance = new mytype()
var/atom/movable/screen/plane_master/instance = new mytype(null, src)
plane_masters["[instance.plane]"] = instance
instance.backdrop(mymob)
for(var/mytype in subtypesof(/atom/movable/plane_master_controller))
var/atom/movable/plane_master_controller/controller_instance = new mytype(src)
var/atom/movable/plane_master_controller/controller_instance = new mytype(null, src)
plane_master_controllers[controller_instance.name] = controller_instance
screentip_text = new(null, src)
@@ -322,14 +322,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
hand_slots = list()
var/atom/movable/screen/inventory/hand/hand_box
for(var/i in 1 to mymob.held_items.len)
hand_box = new /atom/movable/screen/inventory/hand()
hand_box = new /atom/movable/screen/inventory/hand(null, src)
hand_box.name = mymob.get_held_index_name(i)
hand_box.icon = ui_style
hand_box.icon_state = "hand_[mymob.held_index_to_dir(i)]"
hand_box.screen_loc = ui_hand_position(i)
hand_box.held_index = i
hand_slots["[i]"] = hand_box
hand_box.hud = src
static_inventory += hand_box
hand_box.update_icon()

View File

@@ -186,54 +186,47 @@
var/atom/movable/screen/using
var/atom/movable/screen/inventory/inv_box
using = new/atom/movable/screen/language_menu
using = new/atom/movable/screen/language_menu(null, src)
using.icon = ui_style
if(!widescreenlayout) // CIT CHANGE
using.screen_loc = ui_boxlang // CIT CHANGE
using.hud = src
static_inventory += using
using = new /atom/movable/screen/area_creator
using = new /atom/movable/screen/area_creator(null, src)
using.icon = ui_style
if(!widescreenlayout) // CIT CHANGE
using.screen_loc = ui_boxarea // CIT CHANGE
using.hud = src
static_inventory += using
using = new /atom/movable/screen/voretoggle() //We fancy Vore now
using = new /atom/movable/screen/voretoggle(null, src) //We fancy Vore now
using.icon = tg_ui_icon_to_cit_ui(ui_style)
using.screen_loc = ui_voremode
if(!widescreenlayout)
using.screen_loc = ui_boxvore
using.hud = src
static_inventory += using
action_intent = new /atom/movable/screen/act_intent/segmented
action_intent = new /atom/movable/screen/act_intent/segmented(null, src)
action_intent.icon_state = mymob.a_intent
action_intent.hud = src
static_inventory += action_intent
assert_move_intent_ui(owner, TRUE)
// clickdelay
clickdelay = new
clickdelay.hud = src
clickdelay = new(null, src)
clickdelay.screen_loc = ui_clickdelay
static_inventory += clickdelay
// resistdelay
resistdelay = new
resistdelay.hud = src
resistdelay = new(null, src)
resistdelay.screen_loc = ui_resistdelay
static_inventory += resistdelay
using = new /atom/movable/screen/drop()
using = new /atom/movable/screen/drop(null, src)
using.icon = ui_style
using.screen_loc = ui_drop_throw
using.hud = src
static_inventory += using
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "uniform"
inv_box.icon = ui_style
inv_box.slot_id = ITEM_SLOT_ICLOTHING
@@ -242,7 +235,7 @@
inv_box.screen_loc = ui_iclothing
toggleable_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "suit"
inv_box.icon = ui_style
inv_box.slot_id = ITEM_SLOT_OCLOTHING
@@ -253,21 +246,19 @@
build_hand_slots()
using = new /atom/movable/screen/swap_hand()
using = new /atom/movable/screen/swap_hand(null, src)
using.icon = ui_style
using.icon_state = "swap_1"
using.screen_loc = ui_swaphand_position(owner,1)
using.hud = src
static_inventory += using
using = new /atom/movable/screen/swap_hand()
using = new /atom/movable/screen/swap_hand(null, src)
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand_position(owner,2)
using.hud = src
static_inventory += using
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "id"
inv_box.icon = ui_style
inv_box.icon_state = "id"
@@ -276,7 +267,7 @@
inv_box.slot_id = ITEM_SLOT_ID
static_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "mask"
inv_box.icon = ui_style
inv_box.icon_state = "mask"
@@ -285,7 +276,7 @@
inv_box.slot_id = ITEM_SLOT_MASK
toggleable_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "neck"
inv_box.icon = ui_style
inv_box.icon_state = "neck"
@@ -294,7 +285,7 @@
inv_box.slot_id = ITEM_SLOT_NECK
toggleable_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "back"
inv_box.icon = ui_style
inv_box.icon_state = "back"
@@ -303,7 +294,7 @@
inv_box.slot_id = ITEM_SLOT_BACK
static_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "left pocket"
inv_box.icon = ui_style
inv_box.icon_state = "pocket"
@@ -312,7 +303,7 @@
inv_box.slot_id = ITEM_SLOT_LPOCKET
static_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "right pocket"
inv_box.icon = ui_style
inv_box.icon_state = "pocket"
@@ -321,7 +312,7 @@
inv_box.slot_id = ITEM_SLOT_RPOCKET
static_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "suit storage"
inv_box.icon = ui_style
inv_box.icon_state = "suit_storage"
@@ -330,32 +321,28 @@
inv_box.slot_id = ITEM_SLOT_SUITSTORE
static_inventory += inv_box
using = new /atom/movable/screen/resist()
using = new /atom/movable/screen/resist(null, src)
using.icon = ui_style
using.screen_loc = ui_overridden_resist // CIT CHANGE - changes this to overridden resist
using.hud = src
hotkeybuttons += using
rest_icon = new /atom/movable/screen/rest()
rest_icon = new /atom/movable/screen/rest(null, src)
rest_icon.icon = ui_style
rest_icon.screen_loc = ui_pull_resist
rest_icon.hud = src
static_inventory += rest_icon
//END OF CIT CHANGES
using = new /atom/movable/screen/human/toggle()
using = new /atom/movable/screen/human/toggle(null, src)
using.icon = ui_style
using.screen_loc = ui_inventory
using.hud = src
static_inventory += using
using = new /atom/movable/screen/human/equip()
using = new /atom/movable/screen/human/equip(null, src)
using.icon = ui_style
using.screen_loc = ui_equip_position(mymob)
using.hud = src
static_inventory += using
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "gloves"
inv_box.icon = ui_style
inv_box.icon_state = "gloves"
@@ -364,7 +351,7 @@
inv_box.slot_id = ITEM_SLOT_GLOVES
toggleable_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "eyes"
inv_box.icon = ui_style
inv_box.icon_state = "glasses"
@@ -373,7 +360,7 @@
inv_box.slot_id = ITEM_SLOT_EYES
toggleable_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "ears"
inv_box.icon = ui_style
inv_box.icon_state = "ears"
@@ -382,7 +369,7 @@
inv_box.slot_id = ITEM_SLOT_EARS
toggleable_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "head"
inv_box.icon = ui_style
inv_box.icon_state = "head"
@@ -391,7 +378,7 @@
inv_box.slot_id = ITEM_SLOT_HEAD
toggleable_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "shoes"
inv_box.icon = ui_style
inv_box.icon_state = "shoes"
@@ -400,7 +387,7 @@
inv_box.slot_id = ITEM_SLOT_FEET
toggleable_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "belt"
inv_box.icon = ui_style
inv_box.icon_state = "belt"
@@ -409,77 +396,62 @@
inv_box.slot_id = ITEM_SLOT_BELT
static_inventory += inv_box
throw_icon = new /atom/movable/screen/throw_catch()
throw_icon = new /atom/movable/screen/throw_catch(null, src)
throw_icon.icon = ui_style
throw_icon.screen_loc = ui_drop_throw
throw_icon.hud = src
hotkeybuttons += throw_icon
healths = new /atom/movable/screen/healths()
healths.hud = src
healths = new /atom/movable/screen/healths(null, src)
infodisplay += healths
staminas = new /atom/movable/screen/staminas()
staminas.hud = src
staminas = new /atom/movable/screen/staminas(null, src)
infodisplay += staminas
if(!CONFIG_GET(flag/disable_stambuffer))
staminabuffer = new /atom/movable/screen/staminabuffer()
staminabuffer.hud = src
staminabuffer = new /atom/movable/screen/staminabuffer(null, src)
infodisplay += staminabuffer
//END OF CIT CHANGES
healthdoll = new /atom/movable/screen/healthdoll()
healthdoll.hud = src
healthdoll = new /atom/movable/screen/healthdoll(null, src)
infodisplay += healthdoll
pull_icon = new /atom/movable/screen/pull()
pull_icon = new /atom/movable/screen/pull(null, src)
pull_icon.icon = ui_style
pull_icon.hud = src
pull_icon.update_icon()
pull_icon.screen_loc = ui_pull_resist
static_inventory += pull_icon
lingchemdisplay = new /atom/movable/screen/ling/chems()
lingchemdisplay.hud = src
lingchemdisplay = new /atom/movable/screen/ling/chems(null, src)
infodisplay += lingchemdisplay
lingstingdisplay = new /atom/movable/screen/ling/sting()
lingstingdisplay.hud = src
lingstingdisplay = new /atom/movable/screen/ling/sting(null, src)
infodisplay += lingstingdisplay
devilsouldisplay = new /atom/movable/screen/devil/soul_counter
devilsouldisplay.hud = src
devilsouldisplay = new /atom/movable/screen/devil/soul_counter(null, src)
infodisplay += devilsouldisplay
blood_display = new /atom/movable/screen/bloodsucker/blood_counter // Blood Volume
blood_display.hud = src
blood_display = new /atom/movable/screen/bloodsucker/blood_counter(null, src) // Blood Volume
infodisplay += blood_display
vamprank_display = new /atom/movable/screen/bloodsucker/rank_counter // Bloodsucker Rank
vamprank_display.hud = src
vamprank_display = new /atom/movable/screen/bloodsucker/rank_counter(null, src) // Bloodsucker Rank
infodisplay += vamprank_display
sunlight_display = new /atom/movable/screen/bloodsucker/sunlight_counter // Sunlight
sunlight_display.hud = src
sunlight_display = new /atom/movable/screen/bloodsucker/sunlight_counter(null, src) // Sunlight
infodisplay += sunlight_display
coolant_display = new /atom/movable/screen/synth/coolant_counter //Coolant & cooling efficiency readouts for Synths.
coolant_display.hud = src
coolant_display = new /atom/movable/screen/synth/coolant_counter(null, src) //Coolant & cooling efficiency readouts for Synths.
infodisplay += coolant_display
zone_select = new /atom/movable/screen/zone_sel()
zone_select = new /atom/movable/screen/zone_sel(null, src)
zone_select.icon = ui_style
zone_select.hud = src
zone_select.update_icon()
static_inventory += zone_select
combo_display = new /atom/movable/screen/combo()
combo_display = new /atom/movable/screen/combo(null, src)
infodisplay += combo_display
for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv
inv.update_icon()
@@ -500,10 +472,9 @@
// make new ones
// walk/run
using = new /atom/movable/screen/mov_intent
using = new /atom/movable/screen/mov_intent(null, src)
using.icon = tg_ui_icon_to_cit_ui(ui_style) // CIT CHANGE - overrides mov intent icon
using.screen_loc = ui_movi
using.hud = src
using.update_icon()
static_inventory += using
if(!on_new)
@@ -513,19 +484,17 @@
return
// sprint button
using = new /atom/movable/screen/sprintbutton
using = new /atom/movable/screen/sprintbutton(null, src)
using.icon = tg_ui_icon_to_cit_ui(ui_style)
using.icon_state = ((owner.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) ? "act_sprint_on" : "act_sprint")
using.screen_loc = ui_movi
using.hud = src
static_inventory += using
if(!on_new)
owner?.client?.screen += using
// same as above but buffer.
sprint_buffer = new /atom/movable/screen/sprint_buffer
sprint_buffer = new /atom/movable/screen/sprint_buffer(null, src)
sprint_buffer.screen_loc = ui_sprintbufferloc
sprint_buffer.hud = src
static_inventory += sprint_buffer
if(!on_new)
owner?.client?.screen += using

View File

@@ -4,13 +4,11 @@
/datum/hud/lavaland_elite/New(mob/living/simple_animal/hostile/asteroid/elite)
..()
pull_icon = new /atom/movable/screen/pull()
pull_icon = new /atom/movable/screen/pull(null, src)
pull_icon.icon = ui_style
pull_icon.hud = src
pull_icon.update_icon()
pull_icon.screen_loc = ui_living_pull
static_inventory += pull_icon
healths = new /atom/movable/screen/healths/lavaland_elite()
healths.hud = src
healths = new /atom/movable/screen/healths/lavaland_elite(null, src)
infodisplay += healths

View File

@@ -3,48 +3,42 @@
var/atom/movable/screen/using
var/atom/movable/screen/inventory/inv_box
action_intent = new /atom/movable/screen/act_intent()
action_intent = new /atom/movable/screen/act_intent(null, src)
action_intent.icon = ui_style
action_intent.icon_state = mymob.a_intent
action_intent.screen_loc = ui_acti
action_intent.hud = src
static_inventory += action_intent
using = new /atom/movable/screen/mov_intent()
using = new /atom/movable/screen/mov_intent(null, src)
using.icon = ui_style
using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
using.screen_loc = ui_movi
using.hud = src
static_inventory += using
using = new/atom/movable/screen/language_menu
using = new/atom/movable/screen/language_menu(null, src)
using.icon = ui_style
using.hud = src
static_inventory += using
using = new /atom/movable/screen/drop()
using = new /atom/movable/screen/drop(null, src)
using.icon = ui_style
using.screen_loc = ui_drop_throw
using.hud = src
static_inventory += using
build_hand_slots()
using = new /atom/movable/screen/swap_hand()
using = new /atom/movable/screen/swap_hand(null, src)
using.icon = ui_style
using.icon_state = "swap_1_m" //extra wide!
using.screen_loc = ui_swaphand_position(owner,1)
using.hud = src
static_inventory += using
using = new /atom/movable/screen/swap_hand()
using = new /atom/movable/screen/swap_hand(null, src)
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand_position(owner,2)
using.hud = src
static_inventory += using
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "mask"
inv_box.icon = ui_style
inv_box.icon_state = "mask"
@@ -53,7 +47,7 @@
inv_box.slot_id = ITEM_SLOT_MASK
static_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "neck"
inv_box.icon = ui_style
inv_box.icon_state = "neck"
@@ -62,7 +56,7 @@
inv_box.slot_id = ITEM_SLOT_NECK
static_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "head"
inv_box.icon = ui_style
inv_box.icon_state = "head"
@@ -71,7 +65,7 @@
inv_box.slot_id = ITEM_SLOT_HEAD
static_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box = new /atom/movable/screen/inventory(null, src)
inv_box.name = "back"
inv_box.icon = ui_style
inv_box.icon_state = "back"
@@ -79,49 +73,41 @@
inv_box.slot_id = ITEM_SLOT_BACK
static_inventory += inv_box
throw_icon = new /atom/movable/screen/throw_catch()
throw_icon = new /atom/movable/screen/throw_catch(null, src)
throw_icon.icon = ui_style
throw_icon.screen_loc = ui_drop_throw
throw_icon.hud = src
hotkeybuttons += throw_icon
healths = new /atom/movable/screen/healths()
healths.hud = src
healths = new /atom/movable/screen/healths(null, src)
infodisplay += healths
pull_icon = new /atom/movable/screen/pull()
pull_icon = new /atom/movable/screen/pull(null, src)
pull_icon.icon = ui_style
pull_icon.screen_loc = ui_pull_resist
pull_icon.hud = src
pull_icon.update_icon()
static_inventory += pull_icon
lingchemdisplay = new /atom/movable/screen/ling/chems()
lingchemdisplay.hud = src
lingchemdisplay = new /atom/movable/screen/ling/chems(null, src)
infodisplay += lingchemdisplay
lingstingdisplay = new /atom/movable/screen/ling/sting()
lingstingdisplay.hud = src
lingstingdisplay = new /atom/movable/screen/ling/sting(null, src)
infodisplay += lingstingdisplay
zone_select = new /atom/movable/screen/zone_sel()
zone_select = new /atom/movable/screen/zone_sel(null, src)
zone_select.icon = ui_style
zone_select.hud = src
zone_select.update_icon()
static_inventory += zone_select
mymob.client.screen = list()
using = new /atom/movable/screen/resist()
using = new /atom/movable/screen/resist(null, src)
using.icon = ui_style
using.screen_loc = ui_pull_resist
using.hud = src
hotkeybuttons += using
for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv
inv.update_icon()

View File

@@ -1,9 +1,12 @@
#define SHUTTER_MOVEMENT_DURATION 0.4 SECONDS
#define SHUTTER_WAIT_DURATION 0.2 SECONDS
/// Maximum number of station trait buttons we will display, please think hard before creating scenarios where there are more than this
#define MAX_STATION_TRAIT_BUTTONS_VERTICAL 3
/datum/hud/new_player
///Whether the menu is currently on the client's screen or not
var/menu_hud_status = TRUE
var/list/shown_station_trait_buttons
/datum/hud/new_player/New(mob/dead/new_player/owner)
. = ..()
@@ -13,29 +16,89 @@
/datum/hud/new_player/proc/populate_buttons(mob/dead/new_player/owner)
var/list/buttons = subtypesof(/atom/movable/screen/lobby)
for(var/button_type in buttons)
var/atom/movable/screen/lobby/lobbyscreen = new button_type(our_hud = src)
for (var/atom/movable/screen/lobby/lobbyscreen as anything in buttons)
if (!initial(lobbyscreen.always_available))
continue
lobbyscreen = new lobbyscreen(our_hud = src)
lobbyscreen.SlowInit()
lobbyscreen.hud = src
static_inventory += lobbyscreen
if(!lobbyscreen.always_shown)
lobbyscreen.RegisterSignal(src, COMSIG_HUD_LOBBY_COLLAPSED, TYPE_PROC_REF(/atom/movable/screen/lobby, collapse_button))
lobbyscreen.RegisterSignal(src, COMSIG_HUD_LOBBY_EXPANDED, TYPE_PROC_REF(/atom/movable/screen/lobby, expand_button))
if(istype(lobbyscreen, /atom/movable/screen/lobby/button))
var/atom/movable/screen/lobby/button/lobby_button = lobbyscreen
lobby_button.owner = REF(owner)
if(owner.client.is_localhost())
var/atom/movable/screen/lobby/button/start_now/start_button = new(our_hud = src)
start_button.SlowInit()
static_inventory += start_button
start_button.RegisterSignal(src, COMSIG_HUD_LOBBY_COLLAPSED, TYPE_PROC_REF(/atom/movable/screen/lobby, collapse_button))
start_button.RegisterSignal(src, COMSIG_HUD_LOBBY_EXPANDED, TYPE_PROC_REF(/atom/movable/screen/lobby, expand_button))
show_hud(hud_version)
/// Load and then display the buttons for relevant station traits
/datum/hud/new_player/proc/show_station_trait_buttons()
var/mob/dead/new_player/user = mymob
if (!user.age_verify())
return
for (var/datum/station_trait/trait as anything in GLOB.lobby_station_traits)
if (QDELETED(trait) || !trait.can_display_lobby_button(mymob.client))
remove_station_trait_button(trait)
continue
if(LAZYACCESS(shown_station_trait_buttons, trait))
continue
var/atom/movable/screen/lobby/button/sign_up/sign_up_button = new(our_hud = src)
trait.setup_lobby_button(sign_up_button)
static_inventory |= sign_up_button
LAZYSET(shown_station_trait_buttons, trait, sign_up_button)
RegisterSignal(trait, COMSIG_PARENT_QDELETING, PROC_REF(remove_station_trait_button))
place_station_trait_buttons()
/// Display the buttosn for relevant station traits.
/datum/hud/new_player/proc/place_station_trait_buttons()
if(hud_version != HUD_STYLE_STANDARD || !mymob?.client)
return
var/y_offset = 397
var/x_offset = 233
var/y_button_offset = 27
var/x_button_offset = -27
var/iteration = 0
for(var/trait in shown_station_trait_buttons)
var/atom/movable/screen/lobby/button/sign_up/sign_up_button = shown_station_trait_buttons[trait]
iteration++
sign_up_button.screen_loc = offset_to_screen_loc(x_offset, y_offset, mymob.client.view)
mymob.client.screen |= sign_up_button
if (iteration >= MAX_STATION_TRAIT_BUTTONS_VERTICAL)
iteration = 0
y_offset = 397
x_offset += x_button_offset
else
y_offset += y_button_offset
/// Remove a station trait button, then re-order the rest.
/datum/hud/new_player/proc/remove_station_trait_button(datum/station_trait/trait)
SIGNAL_HANDLER
var/atom/movable/screen/lobby/button/sign_up/button = LAZYACCESS(shown_station_trait_buttons, trait)
if(!button)
return
LAZYREMOVE(shown_station_trait_buttons, trait)
UnregisterSignal(trait, COMSIG_PARENT_QDELETING)
static_inventory -= button
qdel(button)
place_station_trait_buttons()
/atom/movable/screen/lobby
plane = SPLASHSCREEN_PLANE
layer = LOBBY_MENU_LAYER
screen_loc = "TOP,CENTER"
///Whether this HUD element can be hidden from the client's "screen" (moved off-screen) or not
var/always_shown = FALSE
/// If true we will create this button every time the HUD is generated
var/always_available = TRUE
/atom/movable/screen/lobby/New(loc, datum/hud/our_hud, ...)
if(our_hud)
hud = our_hud
set_new_hud(our_hud)
return ..()
/// Run sleeping actions after initialize
@@ -67,11 +130,15 @@
VAR_PROTECTED/enabled = TRUE
///Is the button currently being hovered over with the mouse?
var/highlighted = FALSE
/// The ref of the mob that owns this button. Only the owner can click on it.
var/owner
///Should this button play the select sound?
var/select_sound_play = TRUE
/atom/movable/screen/lobby/button/Click(location, control, params)
if(owner != REF(usr))
if(usr != get_mob())
return
var/mob/dead/new_player/user = usr
if(!user.age_verify())
return
. = ..()
@@ -79,11 +146,19 @@
if(!enabled)
return
flick("[base_icon_state]_pressed", src)
if(select_sound_play)
var/sound/ui_select_sound = sound('sound/misc/menu/ui_select1.ogg')
ui_select_sound.frequency = get_rand_frequency_low_range()
SEND_SOUND(hud.mymob, ui_select_sound)
update_appearance(UPDATE_ICON)
return TRUE
/atom/movable/screen/lobby/button/MouseEntered(location,control,params)
if(owner != REF(usr))
if(usr != get_mob())
return
var/mob/dead/new_player/user = usr
if(!user.age_verify())
return
. = ..()
@@ -91,7 +166,11 @@
update_appearance(UPDATE_ICON)
/atom/movable/screen/lobby/button/MouseExited()
if(owner != REF(usr))
if(usr != get_mob())
return
var/mob/dead/new_player/user = usr
if(!user.age_verify())
return
. = ..()
@@ -178,6 +257,7 @@
new_player.ready = PLAYER_NOT_READY
base_icon_state = "not_ready"
update_appearance(UPDATE_ICON)
SEND_SIGNAL(hud, COMSIG_HUD_PLAYER_READY_TOGGLE)
///Shown when the game has started
/atom/movable/screen/lobby/button/join
@@ -186,12 +266,13 @@
icon = 'icons/hud/lobby/join.dmi'
icon_state = "" //Default to not visible
base_icon_state = "join_game"
enabled = null // set in init
/atom/movable/screen/lobby/button/join/Initialize(mapload)
. = ..()
set_button_status(FALSE)
switch(SSticker.current_state)
if(GAME_STATE_PREGAME, GAME_STATE_STARTUP)
set_button_status(FALSE)
RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, PROC_REF(show_join_button))
if(GAME_STATE_SETTING_UP)
set_button_status(TRUE)
@@ -250,6 +331,7 @@
icon = 'icons/hud/lobby/observe.dmi'
icon_state = "observe_disabled"
base_icon_state = "observe"
enabled = null // set in init
/atom/movable/screen/lobby/button/observe/Initialize(mapload)
. = ..()
@@ -378,6 +460,23 @@
var/mob/dead/new_player/new_player = hud.mymob
new_player.handle_player_polling()
/// A generic "sign up" button used by station traits
/atom/movable/screen/lobby/button/sign_up
icon = 'icons/hud/lobby/signup_button.dmi'
icon_state = "signup"
base_icon_state = "signup"
always_available = FALSE
/atom/movable/screen/lobby/button/sign_up/MouseEntered(location, control, params)
. = ..()
if(QDELETED(src) || !desc)
return
openToolTip(usr, tip_src = src, params = params, title = name, content = desc,)
/atom/movable/screen/lobby/button/sign_up/MouseExited()
. = ..()
closeToolTip(usr)
/atom/movable/screen/lobby/button/collapse
name = "Collapse Lobby Menu"
icon = 'icons/hud/lobby/collapse_expand.dmi'
@@ -387,6 +486,27 @@
screen_loc = "TOP:-82,CENTER:-54"
always_shown = TRUE
var/blip_enabled = TRUE
/atom/movable/screen/lobby/button/collapse/Initialize(mapload, datum/hud/hud_owner)
. = ..()
switch(SSticker.current_state)
if(GAME_STATE_PREGAME, GAME_STATE_STARTUP)
RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, PROC_REF(disable_blip))
RegisterSignal(hud, COMSIG_HUD_PLAYER_READY_TOGGLE, PROC_REF(on_player_ready_toggle))
if(GAME_STATE_SETTING_UP)
blip_enabled = FALSE
RegisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP, PROC_REF(enable_blip))
else
blip_enabled = FALSE
add_overlay(get_blip_overlay())
update_icon(UPDATE_OVERLAYS)
/atom/movable/screen/lobby/button/collapse/update_overlays()
. = ..()
. += get_blip_overlay()
/atom/movable/screen/lobby/button/collapse/Click(location, control, params)
. = ..()
if(!.)
@@ -416,6 +536,38 @@
sleep(2 * SHUTTER_MOVEMENT_DURATION + SHUTTER_WAIT_DURATION)
set_button_status(TRUE)
///Proc to update the ready blip state upon new player's ready status change
/atom/movable/screen/lobby/button/collapse/proc/on_player_ready_toggle()
SIGNAL_HANDLER
update_appearance(UPDATE_ICON)
///Returns a ready blip overlay depending on the player's ready state
/atom/movable/screen/lobby/button/collapse/proc/get_blip_overlay()
var/blip_icon_state = "ready_blip"
if(blip_enabled && hud)
var/mob/dead/new_player/new_player = hud.mymob
blip_icon_state += "_[new_player.ready ? "" : "not_"]ready"
else
blip_icon_state += "_disabled"
var/mutable_appearance/ready_blip = mutable_appearance(icon, blip_icon_state)
return ready_blip
///Disables the ready blip; makes us listen for the setup error to re-enable the blip
/atom/movable/screen/lobby/button/collapse/proc/disable_blip()
SIGNAL_HANDLER
blip_enabled = FALSE
UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP)
RegisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP, PROC_REF(enable_blip))
update_appearance(UPDATE_ICON)
///Enables the ready blip; makes us listen for the setup completion and game start to disable the blip
/atom/movable/screen/lobby/button/collapse/proc/enable_blip()
SIGNAL_HANDLER
blip_enabled = TRUE
UnregisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP)
RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, PROC_REF(disable_blip))
update_appearance(UPDATE_ICON)
///Moves the button to the top of the screen, leaving only the screen part in view
///Sends a signal on the hud for the menu hud elements to listen to
/atom/movable/screen/lobby/button/collapse/proc/collapse_menu()
@@ -424,12 +576,14 @@
animate(src, transform = transform, time = SHUTTER_MOVEMENT_DURATION + SHUTTER_WAIT_DURATION)
//then pull the button up with the shutter and leave it on the edge of the screen
animate(transform = transform.Translate(x = 0, y = 134), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_IN)
SEND_SOUND(hud.mymob, sound('sound/misc/menu/menu_rollup1.ogg'))
///Extends the button back to its usual spot
///Sends a signal on the hud for the menu hud elements to listen to
/atom/movable/screen/lobby/button/collapse/proc/expand_menu()
SEND_SIGNAL(hud, COMSIG_HUD_LOBBY_EXPANDED)
animate(src, transform = matrix(), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_OUT)
SEND_SOUND(hud.mymob, sound('sound/misc/menu/menu_rolldown1.ogg'))
/atom/movable/screen/lobby/shutter
icon = 'icons/hud/lobby/shutter.dmi'
@@ -450,5 +604,22 @@
//pull the shutter back off-screen
animate(transform = matrix(), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_IN)
/// LOCALHOST ONLY - Start Now button
/atom/movable/screen/lobby/button/start_now
name = "Start Now (LOCALHOST ONLY)"
screen_loc = "TOP:-146,CENTER:-54"
icon = 'icons/hud/lobby/start_now.dmi'
icon_state = "start_now"
base_icon_state = "start_now"
always_available = FALSE
select_sound_play = FALSE
/atom/movable/screen/lobby/button/start_now/Click(location, control, params)
. = ..()
if(!. || !usr.client.is_localhost() || !check_rights_for(usr.client, R_SERVER))
return
SEND_SOUND(hud.mymob, sound('sound/effects/splat.ogg', volume = 50))
SSticker.start_immediately = TRUE
#undef SHUTTER_MOVEMENT_DURATION
#undef SHUTTER_WAIT_DURATION

View File

@@ -5,8 +5,11 @@
///hud that owns this controller
var/datum/hud/owner_hud
INITIALIZE_IMMEDIATE(/atom/movable/plane_master_controller)
///Ensures that all the planes are correctly in the controlled_planes list.
/atom/movable/plane_master_controller/New(hud)
/atom/movable/plane_master_controller/Initialize(mapload, datum/hud/hud)
. = ..()
owner_hud = hud
var/assoc_controlled_planes = list()

View File

@@ -7,8 +7,8 @@
icon_state = "radial_center"
/atom/movable/screen/radial/persistent/center/Click(location, control, params)
if(usr.client == parent.current_user)
parent.element_chosen(null,usr)
if(usr == get_mob())
parent.element_chosen(null, usr)
/atom/movable/screen/radial/persistent/center/MouseEntered(location, control, params)
. = ..()

View File

@@ -2,6 +2,5 @@
/datum/hud/revenant/New(mob/owner)
..()
healths = new /atom/movable/screen/healths/revenant()
healths.hud = src
healths = new /atom/movable/screen/healths/revenant(null, src)
infodisplay += healths

View File

@@ -78,64 +78,56 @@
var/mob/living/silicon/robot/robit = mymob
var/atom/movable/screen/using
using = new/atom/movable/screen/language_menu
using = new/atom/movable/screen/language_menu(null, src)
using.screen_loc = ui_borg_language_menu
static_inventory += using
//Radio
using = new /atom/movable/screen/robot/radio()
using = new /atom/movable/screen/robot/radio(null, src)
using.screen_loc = ui_borg_radio
using.hud = src
static_inventory += using
//Module select
if(!robit.inv1)
robit.inv1 = new /atom/movable/screen/robot/module1()
robit.inv1 = new /atom/movable/screen/robot/module1(null, src)
robit.inv1.screen_loc = ui_inv1
robit.inv1.hud = src
static_inventory += robit.inv1
if(!robit.inv2)
robit.inv2 = new /atom/movable/screen/robot/module2()
robit.inv2 = new /atom/movable/screen/robot/module2(null, src)
robit.inv2.screen_loc = ui_inv2
robit.inv2.hud = src
static_inventory += robit.inv2
if(!robit.inv3)
robit.inv3 = new /atom/movable/screen/robot/module3()
robit.inv3 = new /atom/movable/screen/robot/module3(null, src)
robit.inv3.screen_loc = ui_inv3
robit.inv3.hud = src
static_inventory += robit.inv3
//End of module select
using = new /atom/movable/screen/robot/lamp()
using = new /atom/movable/screen/robot/lamp(null, src)
using.screen_loc = ui_borg_lamp
using.hud = src
static_inventory += using
robit.lampButton = using
var/atom/movable/screen/robot/lamp/lampscreen = using
lampscreen.robot = robit
//Photography stuff
using = new /atom/movable/screen/ai/image_take()
using = new /atom/movable/screen/ai/image_take(null, src)
using.screen_loc = ui_borg_camera
using.hud = src
static_inventory += using
//Sec/Med HUDs
using = new /atom/movable/screen/robot/sensors()
using = new /atom/movable/screen/robot/sensors(null, src)
using.screen_loc = ui_borg_sensor
using.hud = src
static_inventory += using
//Borg Integrated Tablet
using = new /atom/movable/screen/robot/modPC()
using = new /atom/movable/screen/robot/modPC(null, src)
using.screen_loc = ui_borg_tablet
using.hud = src
static_inventory += using
robit.interfaceButton = using
if(robit.modularInterface)
@@ -144,64 +136,54 @@
tabletbutton.robot = robit
//Alerts
using = new /atom/movable/screen/robot/alerts()
using = new /atom/movable/screen/robot/alerts(null, src)
using.screen_loc = ui_borg_alerts
using.hud = src
static_inventory += using
//Thrusters
using = new /atom/movable/screen/robot/thrusters()
using = new /atom/movable/screen/robot/thrusters(null, src)
using.screen_loc = ui_borg_thrusters
using.hud = src
static_inventory += using
robit.thruster_button = using
//PDA message
using = new /atom/movable/screen/robot/pda_msg_send
using = new /atom/movable/screen/robot/pda_msg_send(null, src)
using.screen_loc = ui_borg_pda_send
using.hud = src
static_inventory += using
//PDA log
using = new /atom/movable/screen/robot/pda_msg_show
using = new /atom/movable/screen/robot/pda_msg_show(null, src)
using.screen_loc = ui_borg_pda_log
using.hud = src
static_inventory += using
//Intent
action_intent = new /atom/movable/screen/act_intent/robot()
action_intent = new /atom/movable/screen/act_intent/robot(null, src)
action_intent.icon_state = mymob.a_intent
action_intent.hud = src
static_inventory += action_intent
assert_move_intent_ui(owner, TRUE)
//Health
healths = new /atom/movable/screen/healths/robot()
healths.hud = src
healths = new /atom/movable/screen/healths/robot(null, src)
infodisplay += healths
//Installed Module
robit.hands = new /atom/movable/screen/robot/module()
robit.hands = new /atom/movable/screen/robot/module(null, src)
robit.hands.screen_loc = ui_borg_module
robit.hands.hud = src
static_inventory += robit.hands
//Store
module_store_icon = new /atom/movable/screen/robot/store()
module_store_icon = new /atom/movable/screen/robot/store(null, src)
module_store_icon.screen_loc = ui_borg_store
module_store_icon.hud = src
pull_icon = new /atom/movable/screen/pull()
pull_icon = new /atom/movable/screen/pull(null, src)
pull_icon.icon = 'icons/mob/screen_cyborg.dmi'
pull_icon.screen_loc = ui_borg_pull
pull_icon.hud = src
pull_icon.update_icon()
hotkeybuttons += pull_icon
zone_select = new /atom/movable/screen/zone_sel/robot()
zone_select.hud = src
zone_select = new /atom/movable/screen/zone_sel/robot(null, src)
zone_select.update_icon()
static_inventory += zone_select
@@ -222,7 +204,6 @@
using = new /atom/movable/screen/mov_intent
using.icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
using.screen_loc = ui_borg_movi
using.hud = src
using.update_icon()
static_inventory += using
if(!on_new)
@@ -236,7 +217,6 @@
using.icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
using.icon_state = owner.cansprint ? ((owner.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) ? "act_sprint_on" : "act_sprint") : "act_sprint_locked"
using.screen_loc = ui_borg_movi
using.hud = src
static_inventory += using
if(!on_new)
owner?.client?.screen += using

View File

@@ -17,7 +17,7 @@
/// A reference to the object in the slot. Grabs or items, generally.
var/obj/master = null
/// A reference to the owner HUD, if any.
var/datum/hud/hud = null
VAR_PRIVATE/datum/hud/hud = null
/**
* Map name assigned to this object.
* Automatically set by /client/proc/add_obj_to_map.
@@ -31,12 +31,36 @@
* But for now, this works.
*/
var/del_on_map_removal = TRUE
/// If FALSE, this will not be cleared when calling /client/clear_screen()
// var/clear_with_screen = TRUE // Unimplemented
/// If TRUE, clicking the screen element will fall through and perform a default "Click" call
/// Obviously this requires your Click override, if any, to call parent on their own.
/// This is set to FALSE to default to dissade you from doing this.
/// Generally we don't want default Click stuff, which results in bugs like using Telekinesis on a screen element
/// or trying to point your gun at your screen.
var/default_click = FALSE
/atom/movable/screen/Initialize(mapload, datum/hud/hud_owner)
. = ..()
if(isnull(hud_owner)) //some screens set their hud owners on /new, this prevents overriding them with null post atoms init
return
set_new_hud(hud_owner)
/atom/movable/screen/Destroy()
master = null
hud = null
return ..()
/atom/movable/screen/Click(location, control, params)
if(flags_1 & INITIALIZED_1)
SEND_SIGNAL(src, COMSIG_SCREEN_ELEMENT_CLICK, location, control, params, usr)
if(default_click)
return ..()
///Screen elements are always on top of the players screen and don't move so yes they are adjacent
/atom/movable/screen/Adjacent(atom/neighbor, atom/target, atom/movable/mover)
return TRUE
/atom/movable/screen/examine(mob/user)
return list()
@@ -46,6 +70,25 @@
/atom/movable/screen/proc/component_click(atom/movable/screen/component_button/component, params)
return
///setter used to set our new hud
/atom/movable/screen/proc/set_new_hud(datum/hud/hud_owner)
if(hud)
UnregisterSignal(hud, COMSIG_PARENT_QDELETING)
if(isnull(hud_owner))
hud = null
return
hud = hud_owner
RegisterSignal(hud, COMSIG_PARENT_QDELETING, PROC_REF(on_hud_delete))
/// Returns the mob this is being displayed to, if any
/atom/movable/screen/proc/get_mob()
return hud?.mymob
/atom/movable/screen/proc/on_hud_delete(datum/source)
SIGNAL_HANDLER
set_new_hud(hud_owner = null)
/atom/movable/screen/text
icon = null
icon_state = null
@@ -112,7 +155,6 @@
mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/language_menu/Click()
usr.get_language_holder().open_language_menu(usr)
/atom/movable/screen/inventory
@@ -614,7 +656,9 @@
plane = SPLASHSCREEN_PLANE
var/client/holder
/atom/movable/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE, except its not easy
INITIALIZE_IMMEDIATE(/atom/movable/screen/splash)
/atom/movable/screen/splash/Initialize(mapload, datum/hud/hud_owner, client/C, visible, use_previous_title)
. = ..()
if(!istype(C))
return
@@ -629,8 +673,7 @@
icon = SStitle.icon
else
if(!SStitle.previous_icon)
qdel(src)
return
return INITIALIZE_HINT_QDEL
icon = SStitle.previous_icon
holder.screen += src

View File

@@ -1,15 +1,14 @@
/datum/hud/living/simple_animal
ui_style = 'icons/mob/screen_gen.dmi'
/datum/hud/living/simple_animal/New(mob/living/owner)
..()
pull_icon = new /atom/movable/screen/pull()
pull_icon = new /atom/movable/screen/pull(null, src)
pull_icon.icon = ui_style
pull_icon.update_icon()
pull_icon.screen_loc = ui_living_pull
pull_icon.hud = src
static_inventory += pull_icon
//mob health doll! assumes whatever sprite the mob is
healthdoll = new /atom/movable/screen/healthdoll/living()
healthdoll.hud = src
healthdoll = new /atom/movable/screen/healthdoll/living(null, src)
infodisplay += healthdoll

View File

@@ -67,32 +67,26 @@
..()
var/atom/movable/screen/using
using = new /atom/movable/screen/swarmer/FabricateTrap()
using = new /atom/movable/screen/swarmer/FabricateTrap(null, src)
using.screen_loc = ui_hand_position(2)
using.hud = src
static_inventory += using
using = new /atom/movable/screen/swarmer/Barricade()
using = new /atom/movable/screen/swarmer/Barricade(null, src)
using.screen_loc = ui_hand_position(1)
using.hud = src
static_inventory += using
using = new /atom/movable/screen/swarmer/Replicate()
using = new /atom/movable/screen/swarmer/Replicate(null, src)
using.screen_loc = ui_zonesel
using.hud = src
static_inventory += using
using = new /atom/movable/screen/swarmer/RepairSelf()
using = new /atom/movable/screen/swarmer/RepairSelf(null, src)
using.screen_loc = ui_storage1
using.hud = src
static_inventory += using
using = new /atom/movable/screen/swarmer/ToggleLight()
using = new /atom/movable/screen/swarmer/ToggleLight(null, src)
using.screen_loc = ui_back
using.hud = src
static_inventory += using
using = new /atom/movable/screen/swarmer/ContactSwarmers()
using = new /atom/movable/screen/swarmer/ContactSwarmers(null, src)
using.screen_loc = ui_inventory
using.hud = src
static_inventory += using

View File

@@ -77,8 +77,17 @@ PROCESSING_SUBSYSTEM_DEF(station)
var/datum/station_trait/trait_instance = new trait_type()
can_fire = can_fire || trait_instance.trait_processes
station_traits += trait_instance
log_game("Station Trait: [trait_instance.name] chosen for this round.")
if(!trait_instance.blacklist)
return
for(var/i in trait_instance.blacklist)
var/datum/station_trait/trait_to_remove = i
selectable_traits_by_types[initial(trait_to_remove.trait_type)] -= trait_to_remove
/// Update station trait lobby buttons for clients who joined before we initialised this subsystem
/datum/controller/subsystem/processing/station/proc/display_lobby_traits()
for (var/mob/dead/new_player/player as anything in GLOB.new_player_list)
var/datum/hud/new_player/observer_hud = player.hud_used
if (!istype(observer_hud))
continue
observer_hud.show_station_trait_buttons()

View File

@@ -161,7 +161,7 @@ SUBSYSTEM_DEF(ticker)
start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10)
for(var/client/C in GLOB.clients)
window_flash(C, ignorepref = TRUE) //let them know lobby has opened up.
to_chat(world, "<span class='boldnotice'>Welcome to [station_name()]!</span>")
to_chat(world, span_boldnotice("Welcome to [station_name()]!"))
send2chat("New round starting on [SSmapping.config.map_name]!", CONFIG_GET(string/chat_announce_new_game))
current_state = GAME_STATE_PREGAME
SEND_SIGNAL(src, COMSIG_TICKER_ENTER_PREGAME)
@@ -424,7 +424,7 @@ SUBSYSTEM_DEF(ticker)
if (living.client.prefs && living.client.prefs.auto_ooc)
if (living.client.prefs.chat_toggles & CHAT_OOC)
living.client.prefs.chat_toggles ^= CHAT_OOC
var/atom/movable/screen/splash/S = new(living.client, TRUE)
var/atom/movable/screen/splash/S = new(null, living.client, TRUE)
S.Fade(TRUE)
living.client.init_verbs()
livings += living

View File

@@ -60,7 +60,7 @@ SUBSYSTEM_DEF(title)
for(var/thing in GLOB.clients)
if(!thing)
continue
var/atom/movable/screen/splash/S = new(thing, FALSE)
var/atom/movable/screen/splash/S = new(null, thing, FALSE)
S.Fade(FALSE,FALSE)
/datum/controller/subsystem/title/Recover()

View File

@@ -948,20 +948,6 @@
icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "jetboot"
/datum/action/language_menu
name = "Language Menu"
desc = "Open the language menu to review your languages, their keys, and select your default language."
button_icon_state = "language_menu"
check_flags = 0
/datum/action/language_menu/Trigger()
if(!..())
return FALSE
if(ismob(owner))
var/mob/M = owner
var/datum/language_holder/H = M.get_language_holder()
H.open_language_menu(usr)
/datum/action/item_action/wheelys
name = "Toggle Wheely-Heel's Wheels"
desc = "Pops out or in your wheely-heel's wheels."

View File

@@ -28,13 +28,13 @@
lose_text = "<span class='notice'>You suddenly remember how languages work.</span>"
/datum/brain_trauma/severe/aphasia/on_gain()
owner.add_blocked_language(subtypesof(/datum/language/) - /datum/language/aphasia, LANGUAGE_APHASIA)
owner.grant_language(/datum/language/aphasia, TRUE, TRUE, LANGUAGE_APHASIA)
owner.add_blocked_language(subtypesof(/datum/language) - /datum/language/aphasia, LANGUAGE_APHASIA)
owner.grant_language(/datum/language/aphasia, source = LANGUAGE_APHASIA)
..()
/datum/brain_trauma/severe/aphasia/on_lose()
owner.remove_blocked_language(subtypesof(/datum/language/), LANGUAGE_APHASIA)
owner.remove_language(/datum/language/aphasia, TRUE, TRUE, LANGUAGE_APHASIA)
owner.remove_blocked_language(subtypesof(/datum/language), LANGUAGE_APHASIA)
owner.remove_language(/datum/language/aphasia, LANGUAGE_APHASIA)
..()
/datum/brain_trauma/severe/blindness

View File

@@ -40,8 +40,7 @@
/// Creates the hud screen object.
/datum/component/combat_mode/proc/on_mob_hud_created(mob/source)
hud_icon = new
hud_icon.hud = source.hud_used
hud_icon = new(null, source.hud_used)
hud_icon.icon = tg_ui_icon_to_cit_ui(source.hud_used.ui_style)
hud_icon.screen_loc = hud_loc
source.hud_used.static_inventory += hud_icon

View File

@@ -4,11 +4,11 @@
/datum/component/personal_crafting/proc/create_mob_button(mob/user)
var/datum/hud/H = user.hud_used
var/atom/movable/screen/craft/C = new()
var/atom/movable/screen/craft/C = new(null, H)
C.icon = H.ui_style
H.static_inventory += C
user.client.screen += C
RegisterSignal(C, COMSIG_CLICK, PROC_REF(component_ui_interact))
RegisterSignal(C, COMSIG_SCREEN_ELEMENT_CLICK, PROC_REF(component_ui_interact))
/datum/component/personal_crafting
var/busy

View File

@@ -298,10 +298,10 @@
/datum/component/mood/proc/modify_hud(datum/source)
var/mob/living/owner = parent
var/datum/hud/hud = owner.hud_used
screen_obj = new
screen_obj = new(null, hud)
hud.infodisplay += screen_obj
RegisterSignal(hud, COMSIG_PARENT_QDELETING, PROC_REF(unmodify_hud))
RegisterSignal(screen_obj, COMSIG_CLICK, PROC_REF(hud_click))
RegisterSignal(screen_obj, COMSIG_SCREEN_ELEMENT_CLICK, PROC_REF(hud_click))
/datum/component/mood/proc/unmodify_hud(datum/source)
if(!screen_obj || !parent)

View File

@@ -63,7 +63,7 @@ Bonus
if(scramble_language && !current_language) // Last part prevents rerolling language with small amounts of cure.
current_language = pick(subtypesof(/datum/language) - /datum/language/common)
H.add_blocked_language(subtypesof(/datum/language) - current_language, LANGUAGE_VOICECHANGE)
H.grant_language(current_language, TRUE, TRUE, LANGUAGE_VOICECHANGE)
H.grant_language(current_language, source = LANGUAGE_VOICECHANGE)
/datum/symptom/voice_change/End(datum/disease/advance/A)
..()

View File

@@ -409,9 +409,7 @@
if(H.additional_language && H.additional_language != "None")
var/language_entry = GLOB.roundstart_languages[H.additional_language]
if(language_entry)
grant_language(language_entry, TRUE, TRUE)
update_atom_languages()
grant_language(language_entry)
/mob/living/carbon/human/set_species(datum/species/mrace, icon_update = TRUE, pref_load = FALSE)
..()

View File

@@ -64,7 +64,6 @@
var/isholy = FALSE //is this person a chaplain or admin role allowed to use bibles
var/mob/living/enslaved_to //If this mind's master is another mob (i.e. adamantine golems)
var/datum/language_holder/language_holder
var/unconvertable = FALSE
var/late_joiner = FALSE
///has this mind ever been an AI
@@ -96,7 +95,6 @@
/datum/mind/Destroy()
SSticker.minds -= src
QDEL_LIST(antag_datums)
QDEL_NULL(language_holder)
QDEL_NULL(skill_holder)
set_current(null)
soulOwner = null
@@ -118,12 +116,6 @@
/datum/mind/proc/set_original_character(new_original_character)
original_character = WEAKREF(new_original_character)
/datum/mind/proc/get_language_holder()
if(!language_holder)
language_holder = new (src)
return language_holder
/datum/mind/proc/transfer_to(mob/new_character, var/force_key_move = 0)
var/old_character = current
var/signals = SEND_SIGNAL(new_character, COMSIG_MOB_PRE_PLAYER_CHANGE, new_character, old_character) | SEND_SIGNAL(src, COMSIG_PRE_MIND_TRANSFER, new_character, old_character)
@@ -145,7 +137,19 @@
var/datum/atom_hud/antag/hud_to_transfer = antag_hud//we need this because leave_hud() will clear this list
var/mob/living/old_current = current
if(current)
current.transfer_observers_to(new_character) //transfer anyone observing the old character to the new one
//transfer anyone observing the old character to the new one
current.transfer_observers_to(new_character)
// Offload all mind languages from the old holder to a temp one
var/datum/language_holder/empty/temp_holder = new()
var/datum/language_holder/old_holder = old_current.get_language_holder()
var/datum/language_holder/new_holder = new_character.get_language_holder()
// Off load mind languages to the temp holder momentarily
new_holder.transfer_mind_languages(temp_holder)
// Transfer the old holder's mind languages to the new holder
old_holder.transfer_mind_languages(new_holder)
// And finally transfer the temp holder's mind languages back to the old holder
temp_holder.transfer_mind_languages(old_holder)
set_current(new_character) //associate ourself with our new body
new_character.mind = src //and associate our new body with ourself
for(var/a in antag_datums) //Makes sure all antag datums effects are applied in the new body
@@ -162,7 +166,6 @@
if(new_character.client)
LAZYCLEARLIST(new_character.client.recent_examines)
new_character.client.init_verbs() // re-initialize character specific verbs
current.update_atom_languages()
//CIT CHANGE - makes arousal update when transfering bodies
if(isliving(new_character)) //New humans and such are by default enabled arousal. Let's always use the new mind's prefs.

View File

@@ -277,10 +277,10 @@
/datum/mutation/human/stoner/on_acquiring(mob/living/carbon/human/owner)
..()
owner.grant_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_STONER)
owner.grant_language(/datum/language/beachbum, source = LANGUAGE_STONER)
owner.add_blocked_language(subtypesof(/datum/language) - /datum/language/beachbum, LANGUAGE_STONER)
/datum/mutation/human/stoner/on_losing(mob/living/carbon/human/owner)
..()
owner.remove_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_STONER)
owner.remove_language(/datum/language/beachbum, source = LANGUAGE_STONER)
owner.remove_blocked_language(subtypesof(/datum/language) - /datum/language/beachbum, LANGUAGE_STONER)

View File

@@ -1,3 +1,6 @@
/// Station traits displayed in the lobby
GLOBAL_LIST_EMPTY(lobby_station_traits)
///Base class of station traits. These are used to influence rounds in one way or the other by influencing the levers of the station.
/datum/station_trait
///Name of the trait
@@ -22,26 +25,30 @@
var/trait_flags
/// Whether or not this trait can be reverted by an admin
var/can_revert = TRUE
/// If set to true we'll show a button on the lobby to notify people about this trait
var/sign_up_button = FALSE
/// Lobby buttons controlled by this trait
var/list/lobby_buttons = list()
/datum/station_trait/New()
. = ..()
RegisterSignal(SSticker, COMSIG_TICKER_ROUND_STARTING, PROC_REF(on_round_start))
if(sign_up_button)
GLOB.lobby_station_traits += src
if(SSstation.initialized)
SSstation.display_lobby_traits()
if(trait_processes)
START_PROCESSING(SSstation, src)
if(trait_to_give)
ADD_TRAIT(SSstation, trait_to_give, STATION_TRAIT)
/datum/station_trait/Destroy()
destroy_lobby_buttons()
SSstation.station_traits -= src
return ..()
/// Proc ran when round starts. Use this for roundstart effects.
/datum/station_trait/proc/on_round_start()
SIGNAL_HANDLER
return
///type of info the centcom report has on this trait, if any.
/datum/station_trait/proc/get_report()
return "[name] - [report_message]"
@@ -55,3 +62,50 @@
REMOVE_TRAIT(SSstation, trait_to_give, STATION_TRAIT)
qdel(src)
/// Return TRUE if we want to show a lobby button, by default we assume we don't want it after the round begins
/datum/station_trait/proc/can_display_lobby_button(client/player)
return sign_up_button && !SSticker.HasRoundStarted()
/// Apply any additional handling we need to our lobby button
/datum/station_trait/proc/setup_lobby_button(atom/movable/screen/lobby/button/sign_up/lobby_button)
SHOULD_CALL_PARENT(TRUE)
lobby_button.name = name
lobby_buttons |= lobby_button
RegisterSignal(lobby_button, COMSIG_ATOM_UPDATE_ICON, PROC_REF(on_lobby_button_update_icon))
RegisterSignal(lobby_button, COMSIG_SCREEN_ELEMENT_CLICK, PROC_REF(on_lobby_button_click))
RegisterSignal(lobby_button, COMSIG_PARENT_QDELETING, PROC_REF(on_lobby_button_destroyed))
lobby_button.update_appearance(UPDATE_ICON)
/// Called when our lobby button is clicked on
/datum/station_trait/proc/on_lobby_button_click(atom/movable/screen/lobby/button/sign_up/lobby_button, location, control, params, mob/dead/new_player/user)
SIGNAL_HANDLER
return
/// Called when our lobby button tries to update its appearance
/datum/station_trait/proc/on_lobby_button_update_icon(atom/movable/screen/lobby/button/sign_up/lobby_button, updates)
SIGNAL_HANDLER
return
/// Don't hold references to deleted buttons
/datum/station_trait/proc/on_lobby_button_destroyed(atom/movable/screen/lobby/button/sign_up/lobby_button)
SIGNAL_HANDLER
lobby_buttons -= lobby_button
/// Proc ran when round starts. Use this for roundstart effects. By default we clean up our buttons here.
/datum/station_trait/proc/on_round_start()
SIGNAL_HANDLER
destroy_lobby_buttons()
/// Remove all of our active lobby buttons
/datum/station_trait/proc/destroy_lobby_buttons()
for (var/atom/movable/screen/button as anything in lobby_buttons)
var/mob/dead/new_player/hud_owner = button.get_mob()
if (QDELETED(hud_owner))
qdel(button)
continue
var/datum/hud/new_player/using_hud = hud_owner.hud_used
if(!using_hud)
qdel(button)
continue
using_hud.remove_station_trait_button(src)

View File

@@ -152,9 +152,7 @@
. = ..()
//All bots that exist round start have their set language randomized.
for(var/mob/living/simple_animal/bot/found_bot in GLOB.alive_mob_list)
/// The bot's language holder - so we can randomize and change their language
var/datum/language_holder/bot_languages = found_bot.get_language_holder()
bot_languages.selected_language = bot_languages.get_random_spoken_language()
found_bot.set_active_language(found_bot.get_random_spoken_language())
/datum/station_trait/revenge_of_pun_pun
name = "Revenge of Pun Pun"

View File

@@ -975,14 +975,16 @@
/atom/movable/screen/alert/status_effect/strandling/Click(location, control, params)
. = ..()
if(usr != owner)
if(!.)
return
to_chat(owner, "<span class='notice'>You attempt to remove the durathread strand from around your neck.</span>")
if(do_after(owner, 3.5 SECONDS, owner))
if(isliving(owner))
var/mob/living/L = owner
to_chat(owner, "<span class='notice'>You successfully remove the durathread strand.</span>")
L.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
if(!do_after(owner, 3.5 SECONDS, owner))
return
if(!isliving(owner))
return
var/mob/living/L = owner
to_chat(owner, "<span class='notice'>You successfully remove the durathread strand.</span>")
L.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
/datum/status_effect/pacify

View File

@@ -105,6 +105,9 @@
clickable_glow = TRUE
/atom/movable/screen/alert/status_effect/wound/Click()
. = ..()
if(!.)
return
var/mob/living/carbon/C = usr
C.check_self_for_injuries()

View File

@@ -124,7 +124,7 @@
for(var/mob/dead/observer/O in GLOB.player_list)
if(O.key == expected_key)
if(O.client?.address == addr)
new /atom/movable/screen/splash(O.client, TRUE)
new /atom/movable/screen/splash(null, O.client, TRUE)
break
/datum/world_topic/adminmsg

View File

@@ -12,8 +12,11 @@
var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported
var/throw_range = 7
var/mob/pulledby = null
/// What language holder type to init as
var/initial_language_holder = /datum/language_holder
var/datum/language_holder/language_holder // Mindless mobs and objects need language too, some times. Mind holder takes prescedence.
/// Holds all languages this mob can speak and understand
VAR_PRIVATE/datum/language_holder/language_holder
var/verb_say = "says"
var/verb_ask = "asks"
var/verb_exclaim = "exclaims"
@@ -657,44 +660,36 @@
return language_holder
/// Grants the supplied language and sets omnitongue true.
/atom/movable/proc/grant_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_ATOM)
var/datum/language_holder/LH = get_language_holder()
return LH.grant_language(language, understood, spoken, source)
/atom/movable/proc/grant_language(language, language_flags = ALL, source = LANGUAGE_ATOM)
return get_language_holder().grant_language(language, language_flags, source)
/// Grants every language.
/atom/movable/proc/grant_all_languages(understood = TRUE, spoken = TRUE, grant_omnitongue = TRUE, source = LANGUAGE_MIND)
var/datum/language_holder/LH = get_language_holder()
return LH.grant_all_languages(understood, spoken, grant_omnitongue, source)
/atom/movable/proc/grant_all_languages(language_flags = ALL, grant_omnitongue = TRUE, source = LANGUAGE_MIND)
return get_language_holder().grant_all_languages(language_flags, grant_omnitongue, source)
/// Removes a single language.
/atom/movable/proc/remove_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_ALL)
var/datum/language_holder/LH = get_language_holder()
return LH.remove_language(language, understood, spoken, source)
/atom/movable/proc/remove_language(language, language_flags = ALL, source = LANGUAGE_ALL)
return get_language_holder().remove_language(language, language_flags, source)
/// Removes every language and sets omnitongue false.
/atom/movable/proc/remove_all_languages(source = LANGUAGE_ALL, remove_omnitongue = FALSE)
var/datum/language_holder/LH = get_language_holder()
return LH.remove_all_languages(source, remove_omnitongue)
return get_language_holder().remove_all_languages(source, remove_omnitongue)
/// Adds a language to the blocked language list. Use this over remove_language in cases where you will give languages back later.
/atom/movable/proc/add_blocked_language(language, source = LANGUAGE_ATOM)
var/datum/language_holder/LH = get_language_holder()
return LH.add_blocked_language(language, source)
return get_language_holder().add_blocked_language(language, source)
/// Removes a language from the blocked language list.
/atom/movable/proc/remove_blocked_language(language, source = LANGUAGE_ATOM)
var/datum/language_holder/LH = get_language_holder()
return LH.remove_blocked_language(language, source)
return get_language_holder().remove_blocked_language(language, source)
/// Checks if atom has the language. If spoken is true, only checks if atom can speak the language.
/atom/movable/proc/has_language(language, spoken = FALSE)
var/datum/language_holder/LH = get_language_holder()
return LH.has_language(language, spoken)
/atom/movable/proc/has_language(language, flags_to_check)
return get_language_holder().has_language(language, flags_to_check)
/// Checks if atom can speak the language.
/atom/movable/proc/can_speak_language(language)
var/datum/language_holder/LH = get_language_holder()
return LH.can_speak_language(language)
return get_language_holder().can_speak_language(language)
/// Returns the result of tongue specific limitations on spoken languages.
/atom/movable/proc/could_speak_language(language)
@@ -702,33 +697,32 @@
/// Returns selected language, if it can be spoken, or finds, sets and returns a new selected language if possible.
/atom/movable/proc/get_selected_language()
var/datum/language_holder/LH = get_language_holder()
return LH.get_selected_language()
return get_language_holder().get_selected_language()
/// Gets a random understood language, useful for hallucinations and such.
/atom/movable/proc/get_random_understood_language()
var/datum/language_holder/LH = get_language_holder()
return LH.get_random_understood_language()
return get_language_holder().get_random_understood_language()
/// Gets a random spoken language, useful for forced speech and such.
/atom/movable/proc/get_random_spoken_language()
var/datum/language_holder/LH = get_language_holder()
return LH.get_random_spoken_language()
return get_language_holder().get_random_spoken_language()
/// Copies all languages into the supplied atom/language holder. Source should be overridden when you
/// do not want the language overwritten by later atom updates or want to avoid blocked languages.
/atom/movable/proc/copy_languages(from_holder, source_override)
if(isatom(from_holder))
/atom/movable/proc/copy_languages(datum/language_holder/from_holder, source_override)
if(ismovable(from_holder))
var/atom/movable/thing = from_holder
from_holder = thing.get_language_holder()
var/datum/language_holder/LH = get_language_holder()
return LH.copy_languages(from_holder, source_override)
/// Empties out the atom specific languages and updates them according to the current atoms language holder.
/// As a side effect, it also creates missing language holders in the process.
/atom/movable/proc/update_atom_languages()
var/datum/language_holder/LH = get_language_holder()
return LH.update_atom_languages(src)
return get_language_holder().copy_languages(from_holder, source_override)
/// Sets the passed path as the active language
/// Returns the currently selected language if successful, if the language was not valid, returns null
/atom/movable/proc/set_active_language(language_path)
var/datum/language_holder/our_holder = get_language_holder()
our_holder.selected_language = language_path
return our_holder.get_selected_language() // verifies its validity, returns it if successful.
/// Sets the vocal bark for the atom, using the bark's ID
/atom/movable/proc/set_bark(id)

View File

@@ -94,7 +94,7 @@
M.setDir(dir)
buckled_mobs |= M
M.update_mobility()
M.throw_alert("buckled", /atom/movable/screen/alert/restrained/buckled)
M.throw_alert("buckled", /atom/movable/screen/alert/buckled)
post_buckle_mob(M)
SEND_SIGNAL(src, COMSIG_MOVABLE_BUCKLE, M, force)

View File

@@ -220,8 +220,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark)
name = "department_sec"
icon_state = "Security Officer"
/obj/effect/landmark/start/depsec/New()
..()
/obj/effect/landmark/start/depsec/Initialize(mapload)
. = ..()
GLOB.department_security_spawns += src
/obj/effect/landmark/start/depsec/Destroy()
@@ -246,7 +246,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark)
icon_state = "wiznerd_spawn"
/obj/effect/landmark/start/wizard/Initialize(mapload)
..()
. = ..()
GLOB.wizardstart += loc
return INITIALIZE_HINT_QDEL
@@ -256,7 +256,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark)
icon_state = "snukeop_spawn"
/obj/effect/landmark/start/nukeop/Initialize(mapload)
..()
. = ..()
GLOB.nukeop_start += loc
return INITIALIZE_HINT_QDEL
@@ -266,7 +266,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark)
icon_state = "snukeop_leader_spawn"
/obj/effect/landmark/start/nukeop_leader/Initialize(mapload)
..()
. = ..()
GLOB.nukeop_leader_start += loc
return INITIALIZE_HINT_QDEL
@@ -278,7 +278,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
name = "New Player"
/obj/effect/landmark/start/new_player/Initialize(mapload)
..()
. = ..()
GLOB.newplayer_start += loc
return INITIALIZE_HINT_QDEL
@@ -308,7 +308,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
name = "JoinLate"
/obj/effect/landmark/latejoin/Initialize(mapload)
..()
. = ..()
SSjob.latejoin_trackers += loc
return INITIALIZE_HINT_QDEL
@@ -333,7 +333,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
icon_state = "xeno_spawn"
/obj/effect/landmark/xeno_spawn/Initialize(mapload)
..()
. = ..()
GLOB.xeno_spawn += loc
return INITIALIZE_HINT_QDEL
@@ -343,7 +343,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
icon_state = "blob_start"
/obj/effect/landmark/blobstart/Initialize(mapload)
..()
. = ..()
GLOB.blobstart += loc
return INITIALIZE_HINT_QDEL
@@ -352,7 +352,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
icon_state = "secequipment"
/obj/effect/landmark/secequipment/Initialize(mapload)
..()
. = ..()
GLOB.secequipment += loc
return INITIALIZE_HINT_QDEL
@@ -361,7 +361,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
icon_state = "prisonwarp"
/obj/effect/landmark/prisonwarp/Initialize(mapload)
..()
. = ..()
GLOB.prisonwarp += loc
return INITIALIZE_HINT_QDEL
@@ -370,7 +370,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
icon_state = "ert_spawn"
/obj/effect/landmark/ert_spawn/Initialize(mapload)
..()
. = ..()
GLOB.emergencyresponseteamspawn += loc
return INITIALIZE_HINT_QDEL
@@ -379,7 +379,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
icon_state = "holding_facility"
/obj/effect/landmark/holding_facility/Initialize(mapload)
..()
. = ..()
GLOB.holdingfacility += loc
return INITIALIZE_HINT_QDEL
@@ -388,7 +388,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
icon_state = "tdome_observer"
/obj/effect/landmark/thunderdome/observe/Initialize(mapload)
..()
. = ..()
GLOB.tdomeobserve += loc
return INITIALIZE_HINT_QDEL
@@ -397,7 +397,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
icon_state = "tdome_t1"
/obj/effect/landmark/thunderdome/one/Initialize(mapload)
..()
. = ..()
GLOB.tdome1 += loc
return INITIALIZE_HINT_QDEL
@@ -406,7 +406,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
icon_state = "tdome_t2"
/obj/effect/landmark/thunderdome/two/Initialize(mapload)
..()
. = ..()
GLOB.tdome2 += loc
return INITIALIZE_HINT_QDEL
@@ -415,7 +415,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
icon_state = "tdome_admin"
/obj/effect/landmark/thunderdome/admin/Initialize(mapload)
..()
. = ..()
GLOB.tdomeadmin += loc
return INITIALIZE_HINT_QDEL
@@ -426,7 +426,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
layer = MOB_LAYER
/obj/effect/landmark/servant_of_ratvar/Initialize(mapload)
..()
. = ..()
GLOB.servant_spawns += loc
return INITIALIZE_HINT_QDEL
@@ -436,7 +436,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
icon_state = "city_of_cogs"
/obj/effect/landmark/city_of_cogs/Initialize(mapload)
..()
. = ..()
GLOB.city_of_cogs_spawns += loc
return INITIALIZE_HINT_QDEL
@@ -448,7 +448,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
/obj/effect/landmark/event_spawn/New()
..()
. = ..()
GLOB.generic_event_spawns += src
/obj/effect/landmark/event_spawn/Destroy()
@@ -458,9 +458,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
/obj/effect/landmark/ruin
var/datum/map_template/ruin/ruin_template
/obj/effect/landmark/ruin/New(loc, my_ruin_template)
/obj/effect/landmark/ruin/Initialize(mapload, my_ruin_template)
. = ..()
name = "ruin_[GLOB.ruin_landmarks.len + 1]"
..(loc)
ruin_template = my_ruin_template
GLOB.ruin_landmarks |= src
@@ -475,8 +475,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
layer = BULLET_HOLE_LAYER
plane = ABOVE_WALL_PLANE
/obj/effect/landmark/stationroom/New()
..()
/obj/effect/landmark/stationroom/Initialize(mapload)
. = ..()
GLOB.stationroom_landmarks += src
/obj/effect/landmark/stationroom/Destroy()
@@ -514,7 +514,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
templates = list("Engine SM" = 3, "Engine Singulo" = 3, "Engine Tesla" = 3)
icon = 'icons/rooms/box/engine.dmi'
/obj/effect/landmark/stationroom/box/engine/New()
/obj/effect/landmark/stationroom/box/engine/Initialize(mapload)
. = ..()
templates = CONFIG_GET(keyed_list/box_random_engine)

View File

@@ -399,8 +399,8 @@
var/emp_cur_charges = 4
var/charge_tick = 0
/obj/item/flashlight/emp/New()
..()
/obj/item/flashlight/emp/Initialize(mapload)
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/flashlight/emp/Destroy()

View File

@@ -37,8 +37,8 @@
var/forgedseal = 0
var/copy_type = null
/obj/item/documents/photocopy/New(loc, obj/item/documents/copy=null)
..()
/obj/item/documents/photocopy/Initialize(mapload, obj/item/documents/copy=null)
. = ..()
if(copy)
copy_type = copy.type
if(istype(copy, /obj/item/documents/photocopy)) // Copy Of A Copy Of A Copy

View File

@@ -522,7 +522,6 @@
S.ckey = C.ckey
S.status_flags |= GODMODE
S.copy_languages(user, LANGUAGE_MASTER) //Make sure the sword can understand and communicate with the user.
S.update_atom_languages()
grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue
S.AddElement(/datum/element/ghost_role_eligibility,penalize_on_ghost = TRUE)
START_PROCESSING(SSprocessing,src)

View File

@@ -17,8 +17,8 @@
var/fuel_added = 0
var/flame_expiry_timer
/obj/structure/fireplace/New()
..()
/obj/structure/fireplace/Initialize(mapload)
. = ..()
START_PROCESSING(SSobj, src)
/obj/structure/fireplace/Destroy()

View File

@@ -32,7 +32,7 @@
new_spawn.undershirt = "Nude" //changing underwear/shirt/socks doesn't seem to function correctly right now because of some bug elsewhere?
new_spawn.socks = "Nude"
new_spawn.update_body(TRUE)
new_spawn.language_holder.selected_language = /datum/language/sylvan
new_spawn.set_active_language(/datum/language/sylvan)
//Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers.

View File

@@ -154,12 +154,9 @@ GLOBAL_LIST_EMPTY(lifts)
var/list/atom/movable/lift_load //things to move
var/datum/lift_master/lift_master_datum //control from
/obj/structure/industrial_lift/New()
GLOB.lifts.Add(src)
..()
/obj/structure/industrial_lift/Initialize(mapload)
. = ..()
GLOB.lifts.Add(src)
RegisterSignal(src, COMSIG_MOVABLE_CROSSED, PROC_REF(AddItemOnLift))
RegisterSignal(loc, COMSIG_ATOM_CREATED, PROC_REF(AddItemOnLift))//For atoms created on platform
RegisterSignal(src, COMSIG_MOVABLE_UNCROSSED, PROC_REF(RemoveItemFromLift))

View File

@@ -118,23 +118,23 @@
var/list/races_blacklist = list("skeleton", "agent", "military_synth", "memezombies", "clockwork golem servant", "android", "synth", "mush", "zombie", "memezombie")
var/list/choosable_races = list()
/obj/structure/mirror/magic/New()
/obj/structure/mirror/magic/Initialize(mapload)
. = ..()
if(!choosable_races.len)
for(var/speciestype in subtypesof(/datum/species))
var/datum/species/S = new speciestype()
if(!(S.id in races_blacklist))
choosable_races += S.id
..()
/obj/structure/mirror/magic/lesser/New()
/obj/structure/mirror/magic/lesser/Initialize(mapload)
choosable_races = GLOB.roundstart_races.Copy()
..()
return ..()
/obj/structure/mirror/magic/badmin/New()
/obj/structure/mirror/magic/badmin/Initialize(mapload)
for(var/speciestype in subtypesof(/datum/species))
var/datum/species/S = new speciestype()
choosable_races += S.id
..()
return ..()
/obj/structure/mirror/magic/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!ishuman(user))

View File

@@ -15,8 +15,8 @@
var/enter_delay = 0
var/const/time_to_unwrench = 2 SECONDS
/obj/structure/transit_tube/New(loc, newdirection)
..(loc)
/obj/structure/transit_tube/Initialize(mapload, newdirection)
. = ..()
if(newdirection)
setDir(newdirection)
init_tube_dirs()

View File

@@ -232,6 +232,10 @@ distance_multiplier - Can be used to multiply the distance at which the sound is
/proc/get_rand_frequency()
return rand(32000, 55000) //Frequency stuff only works with 45kbps oggs.
///get_rand_frequency but lower range.
/proc/get_rand_frequency_low_range()
return rand(38000, 45000)
/proc/get_sfx(soundin)
if(istext(soundin))
switch(soundin)

View File

@@ -2081,8 +2081,7 @@
if(!ismob(M))
to_chat(usr, "This can only be used on instances of type /mob.")
return
var/datum/language_holder/H = M.get_language_holder()
H.open_language_menu(usr)
M.get_language_holder().open_language_menu(usr)
else if(href_list["traitor"])
if(!check_rights(R_ADMIN))

View File

@@ -135,9 +135,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
/obj/effect/statclick/ticket_list
var/current_state
/obj/effect/statclick/ticket_list/New(loc, name, state)
/obj/effect/statclick/ticket_list/Initialize(mapload, name, state)
. = ..()
current_state = state
..()
/obj/effect/statclick/ticket_list/Click()
GLOB.ahelp_tickets.BrowseTickets(current_state)

View File

@@ -10,12 +10,12 @@
/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
..()
owner.faction |= "slime"
owner.grant_language(/datum/language/slime, TRUE, TRUE, LANGUAGE_GLAND)
owner.grant_language(/datum/language/slime, source = LANGUAGE_GLAND)
/obj/item/organ/heart/gland/slime/Remove(mob/living/carbon/M, special = 0)
..()
owner.faction -= "slime"
owner.remove_language(/datum/language/slime, TRUE, TRUE, LANGUAGE_GLAND)
owner.remove_language(/datum/language/slime, source = LANGUAGE_GLAND)
/obj/item/organ/heart/gland/slime/activate()
to_chat(owner, "<span class='warning'>You feel nauseated!</span>")

View File

@@ -210,7 +210,7 @@
// Physiology
CheckVampOrgans() // Heart, Eyes
// Language
owner.current.grant_language(/datum/language/vampiric, TRUE, TRUE, LANGUAGE_BLOODSUCKER)
owner.current.grant_language(/datum/language/vampiric, source = LANGUAGE_BLOODSUCKER)
owner.hasSoul = FALSE // If false, renders the character unable to sell their soul.
owner.isholy = FALSE // is this person a chaplain or admin role allowed to use bibles
// Disabilities

View File

@@ -48,7 +48,7 @@
objectives += vassal_objective
objectives_given += vassal_objective
give_thrall_eyes()
owner.current.grant_language(/datum/language/vampiric, TRUE, TRUE, LANGUAGE_VASSAL)
owner.current.grant_language(/datum/language/vampiric, source = LANGUAGE_VASSAL)
// Add Antag HUD
update_vassal_icons_added(owner.current, "vassal")
. = ..()

View File

@@ -84,7 +84,7 @@
create_initial_profile()
if(give_objectives)
forge_objectives()
owner.current.grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue. We are able to transform our body after all.
owner.current.get_language_holder().omnitongue = TRUE
remove_clownmut()
. = ..()

View File

@@ -96,7 +96,7 @@
current = mob_override
GLOB.all_clockwork_mobs += current
current.faction |= "ratvar"
current.grant_language(/datum/language/ratvar, TRUE, TRUE, LANGUAGE_CLOCKIE)
current.grant_language(/datum/language/ratvar, source = LANGUAGE_CLOCKIE)
current.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them for whatever reason, we need to update buttons
if(issilicon(current))
var/mob/living/silicon/S = current

View File

@@ -121,7 +121,7 @@
if(mob_override)
current = mob_override
current.faction |= "cult"
current.grant_language(/datum/language/narsie, TRUE, TRUE, LANGUAGE_CULTIST)
current.grant_language(/datum/language/narsie, source = LANGUAGE_CULTIST)
if(!cult_team?.cult_master)
vote.Grant(current)
communion.Grant(current)
@@ -139,7 +139,7 @@
if(mob_override)
current = mob_override
current.faction -= "cult"
current.remove_language(/datum/language/narsie, TRUE, TRUE, LANGUAGE_CULTIST)
current.remove_language(/datum/language/narsie, source = LANGUAGE_CULTIST)
vote.Remove(current)
communion.Remove(current)
magic.Remove(current)

View File

@@ -182,9 +182,8 @@
add_antag_hud(antag_hud_type, antag_hud_name, M)
if(M.hud_used)
var/datum/hud/H = M.hud_used
var/atom/movable/screen/wanted/giving_wanted_lvl = new /atom/movable/screen/wanted()
var/atom/movable/screen/wanted/giving_wanted_lvl = new /atom/movable/screen/wanted(null, H)
H.wanted_lvl = giving_wanted_lvl
giving_wanted_lvl.hud = H
H.infodisplay += giving_wanted_lvl
H.mymob.client.screen += giving_wanted_lvl

View File

@@ -113,9 +113,8 @@
add_antag_hud(antag_hud_type, antag_hud_name, M)
if(M.hud_used)
var/datum/hud/H = M.hud_used
var/atom/movable/screen/wanted/giving_wanted_lvl = new /atom/movable/screen/wanted()
var/atom/movable/screen/wanted/giving_wanted_lvl = new /atom/movable/screen/wanted(null, H)
H.wanted_lvl = giving_wanted_lvl
giving_wanted_lvl.hud = H
H.infodisplay += giving_wanted_lvl
H.mymob.client.screen += giving_wanted_lvl

View File

@@ -65,5 +65,5 @@
/datum/traitor_class/ai/finalize_traitor(datum/antagonist/traitor/T)
T.add_law_zero()
T.owner.current.playsound_local(get_turf(T.owner.current), 'sound/ambience/antag/malf.ogg', 100, FALSE, pressure_affected = FALSE)
T.owner.current.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MALF)
T.owner.current.grant_language(/datum/language/codespeak, source = LANGUAGE_MALF)
return FALSE

View File

@@ -41,13 +41,13 @@
var/spawn_amt_left = 20
var/spawn_fast = 0
/obj/effect/rend/New(loc, var/spawn_type, var/spawn_amt, var/desc, var/spawn_fast)
/obj/effect/rend/Initialize(mapload, spawn_type, spawn_amt, desc, spawn_fast)
. = ..()
src.spawn_path = spawn_type
src.spawn_amt_left = spawn_amt
src.desc = desc
src.spawn_fast = spawn_fast
START_PROCESSING(SSobj, src)
return
/obj/effect/rend/process()
if(!spawn_fast)

View File

@@ -287,9 +287,7 @@
S.real_name = "Shade of [T.real_name]"
T.transfer_ckey(S)
S.original_mind = T.mind
S.copy_languages(T, LANGUAGE_MIND)//Copies the old mobs languages into the new mob holder.
S.update_atom_languages()
grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue
S.get_language_holder().omnitongue = TRUE //Grants omnitongue
if(user)
S.faction |= "[REF(user)]" //Add the master as a faction, allowing inter-mob cooperation
if(user && iscultist(user))

View File

@@ -186,6 +186,6 @@ GLOBAL_DATUM_INIT(gas_data, /datum/auxgm, new)
appearance_flags = TILE_BOUND
vis_flags = NONE
/obj/effect/overlay/gas/New(state)
/obj/effect/overlay/gas/Initialize(mapload, state)
. = ..()
icon_state = state

View File

@@ -169,6 +169,15 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
to_chat(src, "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. Only 10 bucks for 3 months! <a href=\"https://secure.byond.com/membership\">Click Here to find out more</a>.")
return FALSE
return TRUE
/client/proc/is_localhost()
var/static/localhost_addresses = list(
"127.0.0.1",
"::1",
null,
)
return address in localhost_addresses
/*
* Call back proc that should be checked in all paths where a client can send messages
*

View File

@@ -3487,7 +3487,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/language_entry = GLOB.roundstart_languages[additional_language]
if(language_entry)
character.additional_language = language_entry
character.grant_language(language_entry, TRUE, TRUE)
character.grant_language(language_entry)
character.set_bark(bark_id)
character.vocal_speed = bark_speed

View File

@@ -55,7 +55,7 @@
SG.transfer_ckey(SA, FALSE)
SA.grant_all_languages(TRUE, FALSE, FALSE)
SA.grant_all_languages(UNDERSTOOD_LANGUAGE, grant_omnitongue = FALSE, source = LANGUAGE_ATOM)
SA.sentience_act()

View File

@@ -50,4 +50,5 @@
if(visualsOnly)
return
H.grant_all_languages(TRUE, TRUE, TRUE, LANGUAGE_CURATOR)
H.grant_all_languages(source = LANGUAGE_CURATOR)
H.remove_blocked_language(GLOB.all_languages, source=LANGUAGE_ALL)

View File

@@ -46,7 +46,7 @@
return
to_chat(user, "<span class='boldannounce'>You start skimming through [src], and suddenly your mind is filled with codewords and responses.</span>")
user.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND)
user.grant_language(/datum/language/codespeak, source = LANGUAGE_MIND)
use_charge(user)
@@ -65,7 +65,7 @@
M.visible_message("<span class='danger'>[user] beats [M] over the head with [src]!</span>", "<span class='userdanger'>[user] beats you over the head with [src]!</span>", "<span class='italics'>You hear smacking.</span>")
else
M.visible_message("<span class='notice'>[user] teaches [M] by beating [M.p_them()] over the head with [src]!</span>", "<span class='boldnotice'>As [user] hits you with [src], codewords and responses flow through your mind.</span>", "<span class='italics'>You hear smacking.</span>")
M.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND)
M.grant_language(/datum/language/codespeak, source = LANGUAGE_MIND)
use_charge(user)
/obj/item/codespeak_manual/proc/use_charge(mob/user)

View File

@@ -1,23 +1,28 @@
/*!Language holders will either exist in an atom/movable or a mind. Creation of language holders happens
/*!Language holders will either exist in an atom/movable. Creation of language holders happens
automatically when they are needed, for example when something tries to speak.
Where a mind is available, the mind language holder will be the one "in charge". The mind holder
will update its languages based on the atom holder, and will get updated as part of
transformations and other events that cause new languages to become available.
Every language holder has three lists of languages (and sources for each of them):
- understood_languages
- spoken_languages
- blocked_languages
Understood languages let you understand them, spoken languages lets you speak them
(if your tongue is compatible), and blocked languages will let you do neither no matter
what the source of the language is.
Language holders are designed to mostly only ever require the use the helpers in atom/movable
to achieve your goals, but it is also possible to work on them directly if needed. Any adding
and removing of languages and sources should only happen through the procs, as directly changing
these will mess something up somewhere down the line.
All atom movables have the initial_language_holder var which allows you to set the default language
holder to create. For example, /datum/language_holder/alien will give you xenocommon and a block for
galactic common. Human species also have a default language holder var that will be updated on
species change, initial_species_holder.
Key procs
* [grant_language](atom/movable.html#proc/grant_language)
* [remove_language](atom/movable.html#proc/remove_language)
@@ -28,83 +33,86 @@ Key procs
* [has_language](atom/movable.html#proc/has_language)
* [can_speak_language](atom/movable.html#proc/can_speak_language)
* [get_selected_language](atom/movable.html#proc/get_selected_language)
* [update_atom_languages](atom/movable.html#proc/update_atom_languages)
*/
/datum/language_holder
/// Understood languages.
var/list/understood_languages = list(/datum/language/common = list(LANGUAGE_MIND))
/// A list of languages that can be spoken. Tongue organ may also set limits beyond this list.
/// Lazyassoclist of all understood languages
var/list/understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM))
/// Lazyassoclist of languages that can be spoken.
/// Tongue organ may also set limits beyond this list.
var/list/spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM))
/// A list of blocked languages. Used to prevent understanding and speaking certain languages, ie for certain mobs, mutations etc.
var/list/blocked_languages = list()
/// If true, overrides tongue limitations.
/// Lazyassoclist of blocked languages.
/// Used to prevent understanding and speaking certain languages, ie for certain mobs, mutations etc.
var/list/blocked_languages
/// If true, overrides tongue aforementioned limitations.
var/omnitongue = FALSE
/// Handles displaying the language menu UI.
var/datum/language_menu/language_menu
/// Currently spoken language
var/selected_language
/// Tracks the entity that owns the holder.
var/owner
var/atom/movable/owner
/// Initializes, and copies in the languages from the current atom if available.
/datum/language_holder/New(_owner)
owner = _owner
if(istype(owner, /datum/mind))
var/datum/mind/M = owner
if(M.current)
update_atom_languages(M.current)
get_selected_language()
/datum/language_holder/New(atom/new_owner)
if(new_owner)
if(QDELETED(new_owner))
CRASH("Langauge holder added to a qdeleting thing, what the fuck [text_ref(new_owner)]")
if(!ismovable(new_owner))
CRASH("Language holder being added to a non-movable thing, this is invalid (was: [new_owner] / [new_owner.type])")
owner = new_owner
// If we have an owner, we'll set a default selected language
if(owner)
get_selected_language()
/datum/language_holder/Destroy()
QDEL_NULL(language_menu)
owner = null
return ..()
/// Grants the supplied language.
/datum/language_holder/proc/grant_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_MIND)
if(understood)
if(!understood_languages[language])
understood_languages[language] = list()
understood_languages[language] |= source
/datum/language_holder/proc/grant_language(language, language_flags = ALL, source = LANGUAGE_MIND)
if(language_flags & UNDERSTOOD_LANGUAGE)
LAZYORASSOCLIST(understood_languages, language, source)
. = TRUE
if(spoken)
if(!spoken_languages[language])
spoken_languages[language] = list()
spoken_languages[language] |= source
if(language_flags & SPOKEN_LANGUAGE)
LAZYORASSOCLIST(spoken_languages, language, source)
. = TRUE
return .
/// Grants every language to understood and spoken, and gives omnitongue.
/datum/language_holder/proc/grant_all_languages(understood = TRUE, spoken = TRUE, grant_omnitongue = TRUE, source = LANGUAGE_MIND)
/datum/language_holder/proc/grant_all_languages(language_flags = ALL, grant_omnitongue = TRUE, source = LANGUAGE_MIND)
for(var/language in GLOB.all_languages)
grant_language(language, understood, spoken, source)
if(grant_omnitongue) // Overrides tongue limitations.
grant_language(language, language_flags, source)
if(grant_omnitongue) // Overrides tongue limitations.
omnitongue = TRUE
return TRUE
/// Removes a single language or source, removing all sources returns the pre-removal state of the language.
/datum/language_holder/proc/remove_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_ALL)
if(understood && understood_languages[language])
/datum/language_holder/proc/remove_language(language, language_flags = ALL, source = LANGUAGE_ALL)
if(language_flags & UNDERSTOOD_LANGUAGE)
if(source == LANGUAGE_ALL)
understood_languages -= language
LAZYREMOVE(understood_languages, language)
else
understood_languages[language] -= source
if(!length(understood_languages[language]))
understood_languages -= language
LAZYREMOVEASSOC(understood_languages, language, source)
. = TRUE
if(spoken && spoken_languages[language])
if(language_flags & SPOKEN_LANGUAGE)
if(source == LANGUAGE_ALL)
spoken_languages -= language
LAZYREMOVE(spoken_languages, language)
else
spoken_languages[language] -= source
if(!length(spoken_languages[language]))
spoken_languages -= language
LAZYREMOVEASSOC(spoken_languages, language, source)
. = TRUE
return .
/// Removes every language and optionally sets omnitongue false. If a non default source is supplied, only removes that source.
/datum/language_holder/proc/remove_all_languages(source = LANGUAGE_ALL, remove_omnitongue = FALSE)
for(var/language in GLOB.all_languages)
remove_language(language, TRUE, TRUE, source)
remove_language(language, ALL, source)
if(remove_omnitongue)
omnitongue = FALSE
return TRUE
@@ -113,41 +121,41 @@ Key procs
/datum/language_holder/proc/add_blocked_language(languages, source = LANGUAGE_MIND)
if(!islist(languages))
languages = list(languages)
for(var/language in languages)
if(!blocked_languages[language])
blocked_languages[language] = list()
blocked_languages[language] |= source
LAZYORASSOCLIST(blocked_languages, language, source)
return TRUE
/// Removes a single language or list of languages from the blocked language list.
/datum/language_holder/proc/remove_blocked_language(languages, source = LANGUAGE_MIND)
if(!islist(languages))
languages = list(languages)
for(var/language in languages)
if(blocked_languages[language])
if(source == LANGUAGE_ALL)
blocked_languages -= language
else
blocked_languages[language] -= source
if(!length(blocked_languages[language]))
blocked_languages -= language
if(source == LANGUAGE_ALL)
LAZYREMOVE(blocked_languages, language)
else
LAZYREMOVEASSOC(blocked_languages, language, source)
return TRUE
/// Checks if you have the language. If spoken is true, only checks if you can speak the language.
/datum/language_holder/proc/has_language(language, spoken = FALSE)
/// Checks if you have the language passed.
/datum/language_holder/proc/has_language(language, flag_to_check = UNDERSTOOD_LANGUAGE)
if(language in blocked_languages)
return FALSE
if(spoken)
return language in spoken_languages
return language in understood_languages
var/list/langs_to_check = list()
if(flag_to_check & SPOKEN_LANGUAGE)
langs_to_check |= spoken_languages
if(flag_to_check & UNDERSTOOD_LANGUAGE)
langs_to_check |= understood_languages
return language in langs_to_check
/// Checks if you can speak the language. Tongue limitations should be supplied as an argument.
/datum/language_holder/proc/can_speak_language(language)
var/atom/movable/ouratom = get_atom()
var/tongue = ouratom.could_speak_language(language)
if((omnitongue || tongue) && has_language(language, TRUE))
return TRUE
return FALSE
var/can_speak_language_path = omnitongue || owner.could_speak_language(language)
return (can_speak_language_path && has_language(language, SPOKEN_LANGUAGE))
/// Returns selected language if it can be spoken, or decides, sets and returns a new selected language if possible.
/datum/language_holder/proc/get_selected_language()
@@ -172,59 +180,79 @@ Key procs
/datum/language_holder/proc/get_random_spoken_language()
return pick(spoken_languages)
/// Gets a random spoken language, trying to get a non-common language.
/datum/language_holder/proc/get_random_spoken_uncommon_language()
var/list/languages_minus_common = assoc_to_keys(spoken_languages) - /datum/language/common
// They have a language other than common
if(length(languages_minus_common))
return pick(languages_minus_common)
// They can only speak common, oh well.
else
return /datum/language/common
/// Opens a language menu reading from the language holder.
/datum/language_holder/proc/open_language_menu(mob/user)
if(!language_menu)
language_menu = new (src)
language_menu.ui_interact(user)
/// Gets the atom, since we some times need to check if the tongue has limitations.
/datum/language_holder/proc/get_atom()
if(owner)
if(istype(owner, /datum/mind))
var/datum/mind/M = owner
return M.current
return owner
return FALSE
/// Empties out the atom specific languages and updates them according to the supplied atoms language holder.
/datum/language_holder/proc/update_atom_languages(atom/movable/thing)
var/datum/language_holder/from_atom = thing.get_language_holder(FALSE) //Gets the atoms language holder
if(from_atom == src) //This could happen if called on an atom without a mind.
return FALSE
for(var/language in understood_languages)
remove_language(language, TRUE, FALSE, LANGUAGE_ATOM)
for(var/language in spoken_languages)
remove_language(language, FALSE, TRUE, LANGUAGE_ATOM)
for(var/language in blocked_languages)
remove_blocked_language(language, LANGUAGE_ATOM)
copy_languages(from_atom)
get_selected_language()
return TRUE
/// Copies all languages from the supplied atom/language holder. Source should be overridden when you
/// do not want the language overwritten by later atom updates or want to avoid blocked languages.
/datum/language_holder/proc/copy_languages(var/datum/language_holder/from_holder, source_override)
if(source_override) //No blocked languages here, for now only used by ling absorb.
/datum/language_holder/proc/copy_languages(datum/language_holder/from_holder, source_override)
if(source_override) //No blocked languages here, for now only used by ling absorb.
for(var/language in from_holder.understood_languages)
grant_language(language, TRUE, FALSE, source_override)
grant_language(language, UNDERSTOOD_LANGUAGE, source_override)
for(var/language in from_holder.spoken_languages)
grant_language(language, FALSE, TRUE, source_override)
grant_language(language, SPOKEN_LANGUAGE, source_override)
else
for(var/language in from_holder.understood_languages)
grant_language(language, TRUE, FALSE, from_holder.understood_languages[language])
grant_language(language, UNDERSTOOD_LANGUAGE, from_holder.understood_languages[language])
for(var/language in from_holder.spoken_languages)
grant_language(language, FALSE, TRUE, from_holder.spoken_languages[language])
grant_language(language, SPOKEN_LANGUAGE, from_holder.spoken_languages[language])
for(var/language in from_holder.blocked_languages)
add_blocked_language(language, from_holder.blocked_languages[language])
return TRUE
/// Transfers all mind languages to the supplied language holder.
/datum/language_holder/proc/transfer_mind_languages(datum/language_holder/to_holder)
for(var/language in understood_languages)
if(LANGUAGE_MIND in understood_languages[language])
remove_language(language, UNDERSTOOD_LANGUAGE, LANGUAGE_MIND)
to_holder.grant_language(language, UNDERSTOOD_LANGUAGE, LANGUAGE_MIND)
for(var/language in spoken_languages)
if(LANGUAGE_MIND in spoken_languages[language])
remove_language(language, SPOKEN_LANGUAGE, LANGUAGE_MIND)
to_holder.grant_language(language, SPOKEN_LANGUAGE, LANGUAGE_MIND)
for(var/language in blocked_languages)
if(LANGUAGE_MIND in blocked_languages[language])
remove_blocked_language(language, LANGUAGE_MIND)
to_holder.add_blocked_language(language, LANGUAGE_MIND)
//************************************************
//* Specific language holders *
//* Use atom language sources only. *
//************************************************/
if(owner)
get_selected_language()
if(to_holder.owner)
to_holder.get_selected_language()
/// A global assoc list containing prototypes of all language holders
/// [Language holder typepath] to [language holder instance]
/// Used for easy reference of what can speak what without needing to constantly recreate language holders.
GLOBAL_LIST_INIT(prototype_language_holders, init_language_holder_prototypes())
/// Inits the global list of language holder prototypes.
/proc/init_language_holder_prototypes()
var/list/prototypes = list()
for(var/holdertype in typesof(/datum/language_holder))
prototypes[holdertype] = new holdertype()
return prototypes
/*
* Specific language holders presets
*
* Prefer to use [LANGUGAE_ATOM]. Atom languages will stick through species changes but not mindswaps.
*/
/datum/language_holder/alien
@@ -252,6 +280,10 @@ Key procs
/datum/language_holder/drone/syndicate
blocked_languages = null
/datum/language_holder/human_basic
understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM))
spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM))
/datum/language_holder/dwarf
understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM),
/datum/language/dwarf = list(LANGUAGE_ATOM))
@@ -339,8 +371,12 @@ Key procs
/datum/language/arachnid = list(LANGUAGE_ATOM))
/datum/language_holder/empty
understood_languages = list()
spoken_languages = list()
understood_languages = null
spoken_languages = null
/datum/language_holder/universal
understood_languages = null
spoken_languages = null
/datum/language_holder/universal/New()
..()

View File

@@ -20,109 +20,108 @@
/datum/language_menu/ui_data(mob/user)
var/list/data = list()
var/atom/movable/AM = language_holder.get_atom()
if(isliving(AM))
data["is_living"] = TRUE
else
data["is_living"] = FALSE
var/atom/movable/speaker = language_holder.owner
data["is_living"] = isliving(speaker)
data["languages"] = list()
for(var/lang in GLOB.all_languages)
var/result = language_holder.has_language(lang) || language_holder.has_language(lang, TRUE)
for(var/datum/language/language as anything in GLOB.all_languages)
var/result = language_holder.has_language(language) || language_holder.has_language(language, SPOKEN_LANGUAGE)
if(!result)
continue
var/datum/language/language = lang
var/list/L = list()
var/list/lang_data = list()
L["name"] = initial(language.name)
L["desc"] = initial(language.desc)
L["key"] = initial(language.key)
L["is_default"] = (language == language_holder.selected_language)
if(AM)
L["can_speak"] = AM.can_speak_language(language)
L["can_understand"] = AM.has_language(language)
lang_data["name"] = initial(language.name)
lang_data["desc"] = initial(language.desc)
lang_data["key"] = initial(language.key)
lang_data["is_default"] = (language == language_holder.selected_language)
if(speaker)
lang_data["can_speak"] = speaker.can_speak_language(language)
lang_data["can_understand"] = speaker.has_language(language)
data["languages"] += list(L)
UNTYPED_LIST_ADD(data["languages"], lang_data)
if(check_rights_for(user.client, R_ADMIN) || isobserver(AM))
if(check_rights_for(user.client, R_ADMIN) || isobserver(speaker))
data["admin_mode"] = TRUE
data["omnitongue"] = language_holder.omnitongue
data["unknown_languages"] = list()
for(var/lang in GLOB.all_languages)
if(language_holder.has_language(lang) || language_holder.has_language(lang, TRUE))
for(var/datum/language/language as anything in GLOB.all_languages)
if(language_holder.has_language(language) || language_holder.has_language(language, SPOKEN_LANGUAGE))
continue
var/datum/language/language = lang
var/list/L = list()
var/list/lang_data = list()
L["name"] = initial(language.name)
L["desc"] = initial(language.desc)
L["key"] = initial(language.key)
lang_data["name"] = initial(language.name)
lang_data["desc"] = initial(language.desc)
lang_data["key"] = initial(language.key)
UNTYPED_LIST_ADD(data["unknown_languages"], lang_data)
data["unknown_languages"] += list(L)
return data
/datum/language_menu/ui_act(action, params)
if(..())
. = ..()
if(.)
return
var/mob/user = usr
var/atom/movable/AM = language_holder.get_atom()
var/atom/movable/speaker = language_holder.owner
var/is_admin = check_rights_for(user.client, R_ADMIN)
var/language_name = params["language_name"]
var/datum/language/language_datum
for(var/lang in GLOB.all_languages)
var/datum/language/language = lang
for(var/datum/language/language as anything in GLOB.all_languages)
if(language_name == initial(language.name))
language_datum = language
var/is_admin = check_rights_for(user.client, R_ADMIN)
switch(action)
if("select_default")
if(language_datum && AM.can_speak_language(language_datum))
if(language_datum && speaker.can_speak_language(language_datum))
language_holder.selected_language = language_datum
. = TRUE
if("grant_language")
if((is_admin || isobserver(AM)) && language_datum)
if((is_admin || isobserver(speaker)) && language_datum)
var/list/choices = list("Only Spoken", "Only Understood", "Both")
var/choice = input(user,"How do you want to add this language?","[language_datum]",null) as null|anything in choices
var/spoken = FALSE
var/understood = FALSE
var/choice = tgui_input_list(user, "How do you want to add this language?", "[language_datum]", choices)
if(isnull(choice))
return
var/adding_flags = NONE
switch(choice)
if("Only Spoken")
spoken = TRUE
adding_flags |= SPOKEN_LANGUAGE
if("Only Understood")
understood = TRUE
adding_flags |= UNDERSTOOD_LANGUAGE
if("Both")
spoken = TRUE
understood = TRUE
language_holder.grant_language(language_datum, understood, spoken)
adding_flags |= ALL
if(LAZYACCESS(language_holder.blocked_languages, language_datum))
choice = tgui_alert(user, "Do you want to lift the blockage that's also preventing the language to be spoken or understood?", "[language_datum]", list("Yes", "No"))
if(choice == "Yes")
language_holder.remove_blocked_language(language_datum, LANGUAGE_ALL)
language_holder.grant_language(language_datum, adding_flags)
if(is_admin)
message_admins("[key_name_admin(user)] granted the [language_name] language to [key_name_admin(AM)].")
log_admin("[key_name(user)] granted the language [language_name] to [key_name(AM)].")
message_admins("[key_name_admin(user)] granted the [language_name] language to [key_name_admin(speaker)].")
log_admin("[key_name(user)] granted the language [language_name] to [key_name(speaker)].")
. = TRUE
if("remove_language")
if((is_admin || isobserver(AM)) && language_datum)
if((is_admin || isobserver(speaker)) && language_datum)
var/list/choices = list("Only Spoken", "Only Understood", "Both")
var/choice = input(user,"Which part do you wish to remove?","[language_datum]",null) as null|anything in choices
var/spoken = FALSE
var/understood = FALSE
var/choice = tgui_input_list(user, "Which part do you wish to remove?", "[language_datum]", choices)
if(isnull(choice))
return
var/removing_flags = NONE
switch(choice)
if("Only Spoken")
spoken = TRUE
removing_flags |= SPOKEN_LANGUAGE
if("Only Understood")
understood = TRUE
removing_flags |= UNDERSTOOD_LANGUAGE
if("Both")
spoken = TRUE
understood = TRUE
language_holder.remove_language(language_datum, understood, spoken)
removing_flags |= ALL
language_holder.remove_language(language_datum, removing_flags)
if(is_admin)
message_admins("[key_name_admin(user)] removed the [language_name] language to [key_name_admin(AM)].")
log_admin("[key_name(user)] removed the language [language_name] to [key_name(AM)].")
message_admins("[key_name_admin(user)] removed the [language_name] language to [key_name_admin(speaker)].")
log_admin("[key_name(user)] removed the language [language_name] to [key_name(speaker)].")
. = TRUE
if("toggle_omnitongue")
if(is_admin || isobserver(AM))
if(is_admin || isobserver(speaker))
language_holder.omnitongue = !language_holder.omnitongue
if(is_admin)
message_admins("[key_name_admin(user)] [language_holder.omnitongue ? "enabled" : "disabled"] the ability to speak all languages (that they know) of [key_name_admin(AM)].")
log_admin("[key_name(user)] [language_holder.omnitongue ? "enabled" : "disabled"] the ability to speak all languages (that_they know) of [key_name(AM)].")
message_admins("[key_name_admin(user)] [language_holder.omnitongue ? "enabled" : "disabled"] the ability to speak all languages (that they know) of [key_name_admin(speaker)].")
log_admin("[key_name(user)] [language_holder.omnitongue ? "enabled" : "disabled"] the ability to speak all languages (that_they know) of [key_name(speaker)].")
. = TRUE

View File

@@ -666,6 +666,7 @@
/obj/item/book_of_babel/attack_self(mob/user)
to_chat(user, "You flip through the pages of the book, quickly and conveniently learning every language in existence. Somewhat less conveniently, the aging book crumbles to dust in the process. Whoops.")
user.grant_all_languages()
user.remove_blocked_language(GLOB.all_languages, source = LANGUAGE_ALL)
new /obj/effect/decal/cleanable/ash(get_turf(user))
qdel(src)

View File

@@ -89,20 +89,20 @@ INITIALIZE_IMMEDIATE(/mob/dead)
if(alert(src, "Jump to server [pick] ([addr])?", "Server Hop", "Yes", "No") != "Yes")
return
var/client/C = client
to_chat(C, "<span class='notice'>Sending you to [pick].</span>")
new /atom/movable/screen/splash(C)
var/client/hopper = client
to_chat(hopper, "<span class='notice'>Sending you to [pick].</span>")
new /atom/movable/screen/splash(null, src, hopper, FALSE)
mob_transforming = TRUE
sleep(29) //let the animation play
sleep(2.9 SECONDS) //let the animation play
mob_transforming = FALSE
if(!C)
if(!hopper)
return
winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources
C << link("[addr]")
hopper << link("[addr]")
/mob/dead/proc/update_z(new_z) // 1+ to register, null to unregister
if (registered_z != new_z)

View File

@@ -41,7 +41,3 @@
else
postfix = "soon"
to_chat(src, "Please set up your character and select \"Ready\". The game will start [postfix].")
var/datum/hud/new_player/NH = hud_used
if(istype(NH))
NH.populate_buttons(src)

View File

@@ -27,7 +27,7 @@
/mob/dead/new_player/Initialize(mapload)
if(client && SSticker.state == GAME_STATE_STARTUP)
var/atom/movable/screen/splash/S = new(client, TRUE, TRUE)
var/atom/movable/screen/splash/S = new(null, null, client, TRUE)
S.Fade(TRUE)
if(length(GLOB.newplayer_start))
@@ -491,7 +491,7 @@
if(job && !job.override_latejoin_spawn(character))
SSjob.SendToLateJoin(character)
if(!arrivals_docked)
var/atom/movable/screen/splash/Spl = new(character.client, TRUE)
var/atom/movable/screen/splash/Spl = new(null, character, character.client, TRUE)
Spl.Fade(TRUE)
character.playsound_local(get_turf(character), 'sound/voice/ApproachingTG.ogg', 25)

View File

@@ -6,6 +6,7 @@
can_buckle = TRUE
buckle_lying = FALSE
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
initial_language_holder = /datum/language_holder/empty // We get stuff from our species
/// Enable stamina combat
combat_flags = COMBAT_FLAGS_STAMINA_COMBAT | COMBAT_FLAG_UNARMED_PARRY
status_flags = CANSTUN|CANKNOCKDOWN|CANUNCONSCIOUS|CANPUSH|CANSTAGGER

View File

@@ -86,8 +86,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/dangerous_existence //A flag for transformation spells that tells them "hey if you turn a person into one of these without preperation, they'll probably die!"
///Affects the speech message, for example: Motharula flutters, "My speech message is flutters!"
var/say_mod = "says"
///What languages this species can understand and say. Use a [language holder datum][/datum/language_holder] in this var.
var/species_language_holder = /datum/language_holder
/// What languages this species can understand and say.
/// Use a [language holder datum][/datum/language_holder] typepath in this var.
/// Should never be null.
var/datum/language_holder/species_language_holder = /datum/language_holder/human_basic
/**
* Visible CURRENT bodyparts that are unique to a species.
* DO NOT USE THIS AS A LIST OF ALL POSSIBLE BODYPARTS AS IT WILL FUCK
@@ -544,6 +546,16 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
for(var/obj/item/bodypart/B in C.bodyparts)
B.change_bodypart_status(BODYPART_HYBRID, FALSE, TRUE) // Makes all Bodyparts 'robotic'.
// All languages associated with this language holder are added with source [LANGUAGE_SPECIES]
// rather than source [LANGUAGE_ATOM], so we can track what to remove if our species changes again
var/datum/language_holder/gaining_holder = GLOB.prototype_language_holders[species_language_holder]
for(var/language in gaining_holder.understood_languages)
C.grant_language(language, UNDERSTOOD_LANGUAGE, LANGUAGE_SPECIES)
for(var/language in gaining_holder.spoken_languages)
C.grant_language(language, SPOKEN_LANGUAGE, LANGUAGE_SPECIES)
for(var/language in gaining_holder.blocked_languages)
C.add_blocked_language(language, LANGUAGE_SPECIES)
SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species)
/datum/species/proc/update_species_slowdown(mob/living/carbon/human/H)

View File

@@ -34,11 +34,11 @@
/mob/living/carbon/human/set_drugginess(amount)
..()
if(!amount)
remove_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_HIGH)
remove_language(/datum/language/beachbum, source = LANGUAGE_HIGH)
/mob/living/carbon/human/adjust_drugginess(amount)
..()
if(druggy)
grant_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_HIGH)
grant_language(/datum/language/beachbum, source = LANGUAGE_HIGH)
else
remove_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_HIGH)
remove_language(/datum/language/beachbum, source = LANGUAGE_HIGH)

View File

@@ -486,8 +486,3 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
/mob/living/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
say("#[message]", bubble_type, spans, sanitize, language, ignore_spam, forced)
/mob/living/get_language_holder(get_minds = TRUE)
if(get_minds && mind)
return mind.get_language_holder()
. = ..()

View File

@@ -139,13 +139,11 @@
var/datum/action/innate/pai/light/AL = new /datum/action/innate/pai/light
var/datum/action/innate/custom_holoform/custom_holoform = new /datum/action/innate/custom_holoform
var/datum/action/language_menu/ALM = new
SW.Grant(src)
AS.Grant(src)
AC.Grant(src)
AR.Grant(src)
AL.Grant(src)
ALM.Grant(src)
custom_holoform.Grant(src)
emitter_next_use = world.time + 10 SECONDS

View File

@@ -268,7 +268,7 @@
encryptmod = TRUE
if("translator")
if(href_list["toggle"]) //This is permanent.
grant_all_languages(TRUE, TRUE, TRUE, LANGUAGE_SOFTWARE)
grant_all_languages(source = LANGUAGE_SOFTWARE)
if("doorjack")
if(href_list["jack"])
if(cable && cable.machine)

View File

@@ -24,9 +24,9 @@
robot_modules_background.layer = HUD_LAYER //Objects that appear on screen are on layer ABOVE_HUD_LAYER, UI should be just below it.
robot_modules_background.plane = HUD_PLANE
inv1 = new /atom/movable/screen/robot/module1()
inv2 = new /atom/movable/screen/robot/module2()
inv3 = new /atom/movable/screen/robot/module3()
inv1 = new /atom/movable/screen/robot/module1(null, src)
inv2 = new /atom/movable/screen/robot/module2(null, src)
inv3 = new /atom/movable/screen/robot/module3(null, src)
ident = rand(1, 999)

View File

@@ -954,12 +954,11 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
//Do not do parent's actions, as we *usually* do this differently.
fully_replace_character_name(real_name, new_name)
/mob/verb/open_language_menu()
/mob/verb/open_language_menu_verb()
set name = "Open Language Menu"
set category = "IC"
var/datum/language_holder/H = get_language_holder()
H.open_language_menu(usr)
get_language_holder().open_language_menu(usr)
///Adjust the nutrition of a mob
/mob/proc/adjust_nutrition(change, max = INFINITY) //Honestly FUCK the oldcoders for putting nutrition on /mob someone else can move it up because holy hell I'd have to fix SO many typechecks

View File

@@ -436,7 +436,6 @@
mind.transfer_to(new_xeno)
else
transfer_ckey(new_xeno)
update_atom_languages()
to_chat(new_xeno, "<B>You are now an alien.</B>")
. = new_xeno

View File

@@ -980,7 +980,6 @@
familiar.copy_languages(owner, LANGUAGE_MASTER)
if(linked.saved_mind)
linked.saved_mind.transfer_to(familiar)
familiar.update_atom_languages()
familiar.ckey = linked.saved_mind.key
else
if(familiar.mind)

View File

@@ -159,7 +159,7 @@
to_chat(user, "<span class='boldannounce'>You start skimming through [src], but you already know dronespeak.</span>")
else
to_chat(user, "<span class='boldannounce'>You start skimming through [src], and suddenly the drone chittering makes sense.</span>")
user.grant_language(/datum/language/drone, TRUE, TRUE)//, LANGUAGE_MIND)
user.grant_language(/datum/language/drone, source = LANGUAGE_MIND)
return
if(user.has_language(/datum/language/drone))
@@ -180,7 +180,7 @@
M.visible_message("<span class='danger'>[user] beats [M] over the head with [src]!</span>", "<span class='userdanger'>[user] beats you over the head with [src]!</span>", "<span class='hear'>You hear smacking.</span>")
else
M.visible_message("<span class='notice'>[user] teaches [M] by beating [M.p_them()] over the head with [src]!</span>", "<span class='boldnotice'>As [user] hits you with [src], chitters resonate in your mind.</span>", "<span class='hear'>You hear smacking.</span>")
M.grant_language(/datum/language/drone, TRUE, TRUE) //, LANGUAGE_MIND)
M.grant_language(/datum/language/drone, source = LANGUAGE_MIND)
return
/obj/structure/fluff/oldturret

View File

@@ -14,6 +14,6 @@ GLOBAL_DATUM_INIT(language_menu_state, /datum/ui_state/language_menu, new)
if(check_rights_for(user.client, R_ADMIN))
. = UI_INTERACTIVE
else if(istype(src_object, /datum/language_menu))
var/datum/language_menu/LM = src_object
if(LM.language_holder.get_atom() == user)
var/datum/language_menu/my_languages = src_object
if(my_languages.language_holder.owner == user)
. = UI_INTERACTIVE

View File

@@ -67,6 +67,7 @@
// #include "holidays.dm"
// #include "hydroponics_harvest.dm"
// #include "keybinding_init.dm"
// #include "language_transfer.dm"
#include "machine_disassembly.dm"
#include "medical_wounds.dm"
#include "merge_type.dm"

View File

@@ -0,0 +1,191 @@
// Dedicated to testing language holders
/// Simply tests that swapping to a new species gives you the languages of that species and removes the languages of the old species
/datum/unit_test/language_species_swap_simple
/datum/unit_test/language_species_swap_simple/Run()
var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent)
var/datum/language_holder/holder = dummy.get_language_holder()
var/list/initial_spoken = holder.spoken_languages.Copy()
var/list/initial_understood = holder.understood_languages.Copy()
TEST_ASSERT(length(initial_spoken) == 1, \
"Dummy should only speak one language! Instead, it knew the following: [print_language_list(initial_spoken)]")
TEST_ASSERT(length(initial_understood) == 1, \
"Dummy should only understand one language! Instead, it knew the following: [print_language_list(initial_understood)]")
dummy.set_species(/datum/species/lizard)
TEST_ASSERT(length(holder.spoken_languages) == 2, \
"Dummy should speak two languages - Common and Draconic! Instead, it knew the following: [print_language_list(holder.spoken_languages)]")
TEST_ASSERT(length(holder.understood_languages) == 2, \
"Dummy should understand two languages - Common and Draconic! Instead, it knew the following: [print_language_list(holder.understood_languages)]")
dummy.set_species(/datum/species/human)
TEST_ASSERT(length(initial_spoken & holder.spoken_languages) == 1, \
"Dummy did not speak Common after returning to human! Instead, it knew the following: [print_language_list(holder.spoken_languages)]")
TEST_ASSERT(length(initial_understood & holder.understood_languages) == 1, \
"Dummy did not understand Common after returning to human! Instead, it knew the following: [print_language_list(holder.understood_languages)]")
/// Tests species changes which are more complex are functional (e.g. from a species which speaks common to one which does not)
/datum/unit_test/language_species_swap_complex
/datum/unit_test/language_species_swap_complex/Run()
var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent)
var/datum/language_holder/holder = dummy.get_language_holder()
dummy.set_species(/datum/species/lizard/silverscale)
TEST_ASSERT(!dummy.has_language(/datum/language/common, SPOKEN_LANGUAGE), \
"Changing a mob's species from one which speaks common to one which does not should remove the language!")
TEST_ASSERT(dummy.has_language(/datum/language/common, UNDERSTOOD_LANGUAGE), \
"Changing a mob's species from one which understands common another which does should not remove the language!")
TEST_ASSERT(length(holder.spoken_languages) == 2, \
"Dummy should speak two languages - Uncommon and Draconic! Instead, it knew the following: [print_language_list(holder.spoken_languages)]")
TEST_ASSERT(length(holder.understood_languages) == 3, \
"Dummy should understand two languages - Common, Uncommon and Draconic! Instead, it knew the following: [print_language_list(holder.understood_languages)]")
/// Test that other random languages known are not lost on species change
/datum/unit_test/language_species_change_other_known
/datum/unit_test/language_species_change_other_known/Run()
var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent)
dummy.grant_language(/datum/language/piratespeak, source = LANGUAGE_MIND)
dummy.grant_language(/datum/language/draconic, source = LANGUAGE_ATOM)
dummy.set_species(/datum/species/lizard)
TEST_ASSERT(dummy.has_language(/datum/language/piratespeak, SPOKEN_LANGUAGE), \
"Dummy should still speak Pirate after changing species, as it's a mind language!")
TEST_ASSERT(dummy.has_language(/datum/language/piratespeak, UNDERSTOOD_LANGUAGE), \
"Dummy should still understand Pirate after changing species, as it's a mind language!")
dummy.set_species(/datum/species/human)
TEST_ASSERT(dummy.has_language(/datum/language/draconic, SPOKEN_LANGUAGE), \
"Dummy should still speak Draconic after changing species, as it's an atom language!")
TEST_ASSERT(dummy.has_language(/datum/language/draconic, UNDERSTOOD_LANGUAGE), \
"Dummy should still understand Draconic after changing species, as it's an atom language!")
/// Tests that mind bound languages are not lost swapping into a new mob, but other languages are
/datum/unit_test/language_mind_transfer
/datum/unit_test/language_mind_transfer/Run()
var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent)
var/mob/living/basic/pet/dog/corgi/transfer_target = allocate(/mob/living/basic/pet/dog/corgi)
dummy.mind_initialize()
dummy.grant_language(/datum/language/piratespeak, source = LANGUAGE_MIND)
dummy.grant_language(/datum/language/draconic, source = LANGUAGE_ATOM)
dummy.set_species(/datum/species/lizard/silverscale)
dummy.mind.transfer_to(transfer_target)
// transfer_target should speak and understand pirate
TEST_ASSERT(!dummy.has_language(/datum/language/piratespeak, SPOKEN_LANGUAGE), \
"Dummy should no longer be speaking Pirate after losing their mind!")
TEST_ASSERT(transfer_target.has_language(/datum/language/piratespeak, SPOKEN_LANGUAGE), \
"Dummy's new mob should be capable of speaking Pirate!")
TEST_ASSERT(!dummy.has_language(/datum/language/piratespeak, UNDERSTOOD_LANGUAGE), \
"Dummy should no longer be understanding Pirate after losing their mind!")
TEST_ASSERT(transfer_target.has_language(/datum/language/piratespeak, UNDERSTOOD_LANGUAGE), \
"Dummy's new mob should be capable of understanding Pirate!")
// transfer_target should NOT speak and understand draconic
TEST_ASSERT(dummy.has_language(/datum/language/draconic, SPOKEN_LANGUAGE), \
"Dummy should still understand Draconic after losing their mind - it's an atom language!")
TEST_ASSERT(!transfer_target.has_language(/datum/language/draconic, SPOKEN_LANGUAGE), \
"Dummy's new mob should not understand Draconic - it's an atom language!")
TEST_ASSERT(dummy.has_language(/datum/language/draconic, UNDERSTOOD_LANGUAGE), \
"Dummy should still understand Draconic after losing their mind - it's an atom language!")
TEST_ASSERT(!transfer_target.has_language(/datum/language/draconic, UNDERSTOOD_LANGUAGE), \
"Dummy's new mob should not understand Draconic - it's an atom language!")
// transfer_target should NOT speak and understand uncommon
TEST_ASSERT(dummy.has_language(/datum/language/uncommon, SPOKEN_LANGUAGE), \
"Dummy should still understand Uncommon after losing their mind - it's a species language!")
TEST_ASSERT(!transfer_target.has_language(/datum/language/uncommon, SPOKEN_LANGUAGE), \
"Dummy's new mob should not understand Uncommon - it's a species language!")
TEST_ASSERT(dummy.has_language(/datum/language/uncommon, UNDERSTOOD_LANGUAGE), \
"Dummy should still understand Uncommon after losing their mind - it's a species language!")
TEST_ASSERT(!transfer_target.has_language(/datum/language/uncommon, UNDERSTOOD_LANGUAGE), \
"Dummy's new mob should not understand Uncommon - it's a species language!")
/// Tests that mind bound languages are not lost when swapping with another person (wiz mindswap)
/datum/unit_test/language_mind_swap
/datum/unit_test/language_mind_swap/Run()
var/mob/living/carbon/human/dummy_A = allocate(/mob/living/carbon/human/consistent)
var/mob/living/carbon/human/dummy_B = allocate(/mob/living/carbon/human/consistent)
dummy_A.mind_initialize()
dummy_B.mind_initialize()
var/datum/mind/dummy_A_mind = dummy_A.mind
var/datum/mind/dummy_B_mind = dummy_B.mind
dummy_A.set_species(/datum/species/lizard)
dummy_B.grant_language(/datum/language/piratespeak, source = LANGUAGE_MIND)
dummy_A_mind.transfer_to(dummy_B)
dummy_B_mind.transfer_to(dummy_A)
var/datum/language_holder/holder_A = dummy_A.get_language_holder()
var/datum/language_holder/holder_B = dummy_B.get_language_holder()
// Holder A is a lizard: starts with 2 languages (common, draconic)
// Holder B is a human with a mind language: starts with 2 language (common, pirate)
// Swap occurs
// Holder A is a lizard with 2 languages, but should now also have pirate: 3 languages (common, draconic, pirate)
// Holder B is a human with just 1 language left over (common)
TEST_ASSERT_EQUAL(length(holder_A.spoken_languages), 3, \
"Holder A / Dummy A / Dummy B mind should speak Common, Draconic, and Pirate! \
Instead, it knew the following: [print_language_list(holder_A.spoken_languages)]")
TEST_ASSERT_EQUAL(length(holder_A.understood_languages), 3, \
"Holder A / Dummy A / Dummy B mind should only understand Common, Draconic, and Pirate! \
Instead, it knew the following: [print_language_list(holder_A.understood_languages)]")
TEST_ASSERT_EQUAL(length(holder_B.spoken_languages), 1, \
"Holder B / Dummy B / Dummy A mind should only speak 1 language - Common! \
Instead, it knew the following: [print_language_list(holder_B.spoken_languages)]")
TEST_ASSERT_EQUAL(length(holder_B.understood_languages), 1, \
"Holder B / Dummy B / Dummy A mind only understand 1 language - Common! \
Instead, it knew the following: [print_language_list(holder_B.understood_languages)]")
/// Tests that the book of babel, and by extension grant_all_languages, works as intended
/datum/unit_test/book_of_babel
/datum/unit_test/book_of_babel/Run()
var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent)
var/obj/item/book_of_babel/book = allocate(/obj/item/book_of_babel)
var/datum/language_holder/holder = dummy.get_language_holder()
var/expected_amount = length(GLOB.all_languages)
book.attack_self(dummy)
TEST_ASSERT_EQUAL(length(holder.spoken_languages), expected_amount, "Book of Babel failed to give all languages out!")
dummy.set_species(/datum/species/lizard)
TEST_ASSERT_EQUAL(length(holder.spoken_languages), expected_amount, "Changing species after using the Book of Bable should not remove languages!")
/// Helper proc to print a list of languages in a human readable format
/proc/print_language_list(list/languages_to_print)
var/list/printed_languages = list()
for(var/datum/language/language as anything in languages_to_print)
printed_languages += initial(language.name)
return english_list(printed_languages)

Some files were not shown because too many files have changed in this diff Show More