Revert "12/10/23 - Map swap update" (#15593)
@@ -22,7 +22,7 @@ jobs:
|
||||
- name: Ensure +x on CI directory
|
||||
run: |
|
||||
chmod -R +x ./tools/ci
|
||||
- uses: actions/setup-python@v5
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.7'
|
||||
- name: Generate Changelog
|
||||
|
||||
@@ -3,11 +3,6 @@
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
/// How many chat payloads to keep in history
|
||||
#define CHAT_RELIABILITY_HISTORY_SIZE 5
|
||||
/// How many resends to allow before giving up
|
||||
#define CHAT_RELIABILITY_MAX_RESENDS 3
|
||||
|
||||
#define MESSAGE_TYPE_SYSTEM "system"
|
||||
#define MESSAGE_TYPE_LOCALCHAT "localchat"
|
||||
#define MESSAGE_TYPE_PLOCALCHAT "plocalchat"
|
||||
@@ -15,7 +10,6 @@
|
||||
#define MESSAGE_TYPE_NIF "nif"
|
||||
#define MESSAGE_TYPE_INFO "info"
|
||||
#define MESSAGE_TYPE_WARNING "warning"
|
||||
#define MESSAGE_TYPE_VORE "vore"
|
||||
#define MESSAGE_TYPE_DEADCHAT "deadchat"
|
||||
#define MESSAGE_TYPE_OOC "ooc"
|
||||
#define MESSAGE_TYPE_LOOC "looc"
|
||||
|
||||
@@ -519,37 +519,6 @@ GLOBAL_LIST_EMPTY(cached_examine_icons)
|
||||
|
||||
return list(rsc_ref, hash, "asset.[hash]")
|
||||
|
||||
/// Gets a dummy savefile for usage in icon generation.
|
||||
/// Savefiles generated from this proc will be empty.
|
||||
/proc/get_dummy_savefile(from_failure = FALSE)
|
||||
var/static/next_id = 0
|
||||
if(next_id++ > 9)
|
||||
next_id = 0
|
||||
var/savefile_path = "tmp/dummy-save-[next_id].sav"
|
||||
try
|
||||
if(fexists(savefile_path))
|
||||
fdel(savefile_path)
|
||||
return new /savefile(savefile_path)
|
||||
catch(var/exception/error)
|
||||
// if we failed to create a dummy once, try again; maybe someone slept somewhere they shouldnt have
|
||||
if(from_failure) // this *is* the retry, something fucked up
|
||||
CRASH("get_dummy_savefile failed to create a dummy savefile: '[error]'")
|
||||
return get_dummy_savefile(from_failure = TRUE)
|
||||
|
||||
/**
|
||||
* Converts an icon to base64. Operates by putting the icon in the iconCache savefile,
|
||||
* exporting it as text, and then parsing the base64 from that.
|
||||
* (This relies on byond automatically storing icons in savefiles as base64)
|
||||
*/
|
||||
/proc/icon2base64(icon/icon)
|
||||
if (!isicon(icon))
|
||||
return FALSE
|
||||
var/savefile/dummySave = get_dummy_savefile()
|
||||
WRITE_FILE(dummySave["dummy"], icon)
|
||||
var/iconData = dummySave.ExportText("dummy")
|
||||
var/list/partial = splittext(iconData, "{")
|
||||
return replacetext(copytext_char(partial[2], 3, -5), "\n", "") //if cleanup fails we want to still return the correct base64
|
||||
|
||||
///given a text string, returns whether it is a valid dmi icons folder path
|
||||
/proc/is_valid_dmi_file(icon_path)
|
||||
if(!istext(icon_path) || !length(icon_path))
|
||||
@@ -704,39 +673,6 @@ GLOBAL_LIST_EMPTY(cached_examine_icons)
|
||||
return get_asset_url(key)
|
||||
return "<img class='[extra_classes] icon icon-[icon_state]' src='[get_asset_url(key)]'>"
|
||||
|
||||
/proc/icon2base64html(target, var/custom_classes = "")
|
||||
if (!target)
|
||||
return
|
||||
var/static/list/bicon_cache = list()
|
||||
if (isicon(target))
|
||||
var/icon/target_icon = target
|
||||
var/icon_base64 = icon2base64(target_icon)
|
||||
|
||||
if (target_icon.Height() > world.icon_size || target_icon.Width() > world.icon_size)
|
||||
var/icon_md5 = md5(icon_base64)
|
||||
icon_base64 = bicon_cache[icon_md5]
|
||||
if (!icon_base64) // Doesn't exist yet, make it.
|
||||
bicon_cache[icon_md5] = icon_base64 = icon2base64(target_icon)
|
||||
|
||||
|
||||
return "<img class='icon icon-misc [custom_classes]' src='data:image/png;base64,[icon_base64]'>"
|
||||
|
||||
// Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with.
|
||||
var/atom/target_atom = target
|
||||
var/key = "[istype(target_atom.icon, /icon) ? "[REF(target_atom.icon)]" : target_atom.icon]:[target_atom.icon_state]"
|
||||
|
||||
|
||||
if (!bicon_cache[key]) // Doesn't exist, make it.
|
||||
var/icon/target_icon = icon(target_atom.icon, target_atom.icon_state, SOUTH, 1)
|
||||
if (ishuman(target)) // Shitty workaround for a BYOND issue.
|
||||
var/icon/temp = target_icon
|
||||
target_icon = icon()
|
||||
target_icon.Insert(temp, dir = SOUTH)
|
||||
|
||||
bicon_cache[key] = icon2base64(target_icon)
|
||||
|
||||
return "<img class='icon icon-[target_atom.icon_state] [custom_classes]' src='data:image/png;base64,[bicon_cache[key]]'>"
|
||||
|
||||
//Costlier version of icon2html() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs.
|
||||
/proc/costly_icon2html(thing, target, sourceonly = FALSE)
|
||||
if (!thing)
|
||||
|
||||
@@ -46,9 +46,7 @@
|
||||
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(C.is_preference_enabled(/datum/client_preference/debug/show_debug_logs))
|
||||
to_chat(C,
|
||||
type = MESSAGE_TYPE_DEBUG,
|
||||
html = "<span class='filter_debuglog'>DEBUG: [text]</span>")
|
||||
to_chat(C, "<span class='filter_debuglog'>DEBUG: [text]</span>")
|
||||
|
||||
/proc/log_game(text)
|
||||
if (config.log_game)
|
||||
|
||||
@@ -345,7 +345,7 @@
|
||||
if(!text_tag_cache[tagname])
|
||||
var/icon/tag = icon(text_tag_icons, tagname)
|
||||
text_tag_cache[tagname] = bicon(tag, TRUE, "text_tag")
|
||||
if(!C.tgui_panel.is_ready() || C.tgui_panel.oldchat)
|
||||
if(C.chatOutput.broken)
|
||||
return "<IMG src='\ref[text_tag_icons]' class='text_tag' iconstate='[tagname]'" + (tagdesc ? " alt='[tagdesc]'" : "") + ">"
|
||||
return text_tag_cache[tagname]
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
// #define to_chat(target, message) target << message Not anymore!
|
||||
//#define to_chat to_chat_filename=__FILE__;to_chat_line=__LINE__;to_chat_src=src;__to_chat
|
||||
//#define to_chat __to_chat
|
||||
#define to_chat __to_chat
|
||||
#define to_world(message) to_chat(world, message)
|
||||
#define to_world_log(message) world.log << message
|
||||
// TODO - Baystation has this log to crazy places. For now lets just world.log, but maybe look into it later.
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
|
||||
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc))
|
||||
if(isturf(A) || isturf(A.loc))
|
||||
if(A.Adjacent(src) || (W && W.attack_can_reach(src, A, W.reach))) // see adjacent.dm, allows robots to use ranged melee weapons
|
||||
if(A.Adjacent(src)) // see adjacent.dm
|
||||
|
||||
var/resolved = A.attackby(W, src, 1)
|
||||
if(!resolved && A && W)
|
||||
|
||||
@@ -217,13 +217,13 @@ var/obj/screen/robot_inventory
|
||||
update_robot_modules_display()
|
||||
|
||||
|
||||
/datum/hud/proc/update_robot_modules_display(var/reset = FALSE)
|
||||
/datum/hud/proc/update_robot_modules_display()
|
||||
if(!isrobot(mymob))
|
||||
return
|
||||
|
||||
var/mob/living/silicon/robot/r = mymob
|
||||
|
||||
if(r.shown_robot_modules && !reset)
|
||||
if(r.shown_robot_modules)
|
||||
//Modules display is shown
|
||||
//r.client.screen += robot_inventory //"store" icon
|
||||
|
||||
@@ -292,4 +292,4 @@ var/obj/screen/robot_inventory
|
||||
return sprite_datum.sprite_hud_icon_state
|
||||
if(modtype)
|
||||
return lowertext(modtype)
|
||||
return "nomod"
|
||||
return "nomod"
|
||||
@@ -1,100 +1,77 @@
|
||||
/*!
|
||||
* Copyright (c) 2020 Aleksej Komarov
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
SUBSYSTEM_DEF(chat)
|
||||
name = "Chat"
|
||||
flags = SS_TICKER|SS_NO_INIT
|
||||
wait = 1
|
||||
flags = SS_TICKER
|
||||
wait = 1 // SS_TICKER means this runs every tick
|
||||
priority = FIRE_PRIORITY_CHAT
|
||||
init_order = INIT_ORDER_CHAT
|
||||
|
||||
/// Assosciates a ckey with a list of messages to send to them.
|
||||
var/list/list/datum/chat_payload/client_to_payloads = list()
|
||||
var/list/list/msg_queue = list() //List of lists
|
||||
|
||||
/// Associates a ckey with an assosciative list of their last CHAT_RELIABILITY_HISTORY_SIZE messages.
|
||||
var/list/list/datum/chat_payload/client_to_reliability_history = list()
|
||||
|
||||
/// Assosciates a ckey with their next sequence number.
|
||||
var/list/client_to_sequence_number = list()
|
||||
|
||||
/datum/controller/subsystem/chat/proc/generate_payload(client/target, message_data)
|
||||
var/sequence = client_to_sequence_number[target.ckey]
|
||||
client_to_sequence_number[target.ckey] += 1
|
||||
|
||||
var/datum/chat_payload/payload = new
|
||||
payload.sequence = sequence
|
||||
payload.content = message_data
|
||||
|
||||
if(!(target.ckey in client_to_reliability_history))
|
||||
client_to_reliability_history[target.ckey] = list()
|
||||
var/list/client_history = client_to_reliability_history[target.ckey]
|
||||
client_history["[sequence]"] = payload
|
||||
|
||||
if(length(client_history) > CHAT_RELIABILITY_HISTORY_SIZE)
|
||||
var/oldest = text2num(client_history[1])
|
||||
for(var/index in 2 to length(client_history))
|
||||
var/test = text2num(client_history[index])
|
||||
if(test < oldest)
|
||||
oldest = test
|
||||
client_history -= "[oldest]"
|
||||
return payload
|
||||
|
||||
/datum/controller/subsystem/chat/proc/send_payload_to_client(client/target, datum/chat_payload/payload)
|
||||
target.tgui_panel.window.send_message("chat/message", payload.into_message())
|
||||
SEND_TEXT(target, payload.get_content_as_html())
|
||||
/datum/controller/subsystem/chat/Initialize(timeofday)
|
||||
init_vchat()
|
||||
..()
|
||||
|
||||
/datum/controller/subsystem/chat/fire()
|
||||
for(var/ckey in client_to_payloads)
|
||||
var/client/target = GLOB.directory[ckey]
|
||||
if(isnull(target)) // verify client still exists
|
||||
LAZYREMOVE(client_to_payloads, ckey)
|
||||
continue
|
||||
|
||||
for(var/datum/chat_payload/payload as anything in client_to_payloads[ckey])
|
||||
send_payload_to_client(target, payload)
|
||||
LAZYREMOVE(client_to_payloads, ckey)
|
||||
var/list/msg_queue = src.msg_queue // Local variable for sanic speed.
|
||||
for(var/client/C as anything in msg_queue)
|
||||
var/list/messages = msg_queue[C]
|
||||
msg_queue -= C
|
||||
if (C)
|
||||
C << output(jsEncode(messages), "htmloutput:putmessage")
|
||||
|
||||
if(MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
/datum/controller/subsystem/chat/proc/queue(queue_target, list/message_data)
|
||||
var/list/targets = islist(queue_target) ? queue_target : list(queue_target)
|
||||
for(var/target in targets)
|
||||
var/client/client = CLIENT_FROM_VAR(target)
|
||||
if(isnull(client))
|
||||
continue
|
||||
LAZYADDASSOCLIST(client_to_payloads, client.ckey, generate_payload(client, message_data))
|
||||
/datum/controller/subsystem/chat/stat_entry()
|
||||
..("C:[msg_queue.len]")
|
||||
|
||||
/datum/controller/subsystem/chat/proc/send_immediate(send_target, list/message_data)
|
||||
var/list/targets = islist(send_target) ? send_target : list(send_target)
|
||||
for(var/target in targets)
|
||||
var/client/client = CLIENT_FROM_VAR(target)
|
||||
if(isnull(client))
|
||||
continue
|
||||
send_payload_to_client(client, generate_payload(client, message_data))
|
||||
|
||||
/datum/controller/subsystem/chat/proc/handle_resend(client/client, sequence)
|
||||
var/list/client_history = client_to_reliability_history[client.ckey]
|
||||
sequence = "[sequence]"
|
||||
if(isnull(client_history) || !(sequence in client_history))
|
||||
/datum/controller/subsystem/chat/proc/queue(target, time, message, handle_whitespace = TRUE)
|
||||
if(!target || !message)
|
||||
return
|
||||
|
||||
var/datum/chat_payload/payload = client_history[sequence]
|
||||
if(payload.resends > CHAT_RELIABILITY_MAX_RESENDS)
|
||||
return // we tried but byond said no
|
||||
if(!istext(message))
|
||||
stack_trace("to_chat called with invalid input type")
|
||||
return
|
||||
|
||||
payload.resends += 1
|
||||
send_payload_to_client(client, client_history[sequence])
|
||||
/*
|
||||
SSblackbox.record_feedback(
|
||||
"nested tally",
|
||||
"chat_resend_byond_version",
|
||||
1,
|
||||
list(
|
||||
"[client.byond_version]",
|
||||
"[client.byond_build]",
|
||||
),
|
||||
)
|
||||
*/
|
||||
// Currently to_chat(world, ...) gets sent individually to each client. Consider.
|
||||
if(target == world)
|
||||
target = GLOB.clients
|
||||
|
||||
//Some macros remain in the string even after parsing and fuck up the eventual output
|
||||
var/original_message = message
|
||||
message = replacetext(message, "\n", "<br>")
|
||||
message = replacetext(message, "\improper", "")
|
||||
message = replacetext(message, "\proper", "")
|
||||
|
||||
if(isnull(time))
|
||||
time = world.time
|
||||
|
||||
var/list/messageStruct = list("time" = time, "message" = message);
|
||||
|
||||
if(islist(target))
|
||||
for(var/I in target)
|
||||
var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible
|
||||
|
||||
if(!C || !C.chatOutput)
|
||||
continue // No client? No care.
|
||||
else if(C.chatOutput.broken)
|
||||
DIRECT_OUTPUT(C, original_message)
|
||||
continue
|
||||
else if(!C.chatOutput.loaded)
|
||||
continue // If not loaded yet, do nothing and history-sending on load will get it.
|
||||
|
||||
LAZYINITLIST(msg_queue[C])
|
||||
msg_queue[C][++msg_queue[C].len] = messageStruct
|
||||
else
|
||||
var/client/C = CLIENT_FROM_VAR(target) //Grab us a client if possible
|
||||
|
||||
if(!C || !C.chatOutput)
|
||||
return // No client? No care.
|
||||
else if(C.chatOutput.broken)
|
||||
DIRECT_OUTPUT(C, original_message)
|
||||
return
|
||||
else if(!C.chatOutput.loaded)
|
||||
return // If not loaded yet, do nothing and history-sending on load will get it.
|
||||
|
||||
LAZYINITLIST(msg_queue[C])
|
||||
msg_queue[C][++msg_queue[C].len] = messageStruct
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
/*!
|
||||
* Copyright (c) 2022 Aleksej Komarov
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
SUBSYSTEM_DEF(ping)
|
||||
name = "Ping"
|
||||
priority = FIRE_PRIORITY_PING
|
||||
// init_stage = INITSTAGE_EARLY
|
||||
wait = 4 SECONDS
|
||||
flags = SS_NO_INIT
|
||||
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
|
||||
var/list/currentrun = list()
|
||||
|
||||
/datum/controller/subsystem/ping/stat_entry()
|
||||
..("P:[GLOB.clients.len]")
|
||||
|
||||
/datum/controller/subsystem/ping/fire(resumed = FALSE)
|
||||
// Prepare the new batch of clients
|
||||
if (!resumed)
|
||||
src.currentrun = GLOB.clients.Copy()
|
||||
|
||||
// De-reference the list for sanic speeds
|
||||
var/list/currentrun = src.currentrun
|
||||
|
||||
while (currentrun.len)
|
||||
var/client/client = currentrun[currentrun.len]
|
||||
currentrun.len--
|
||||
|
||||
if(!client.is_preference_enabled(/datum/client_preference/vchat_enable))
|
||||
winset(client, "output", "on-show=&is-disabled=0&is-visible=1")
|
||||
winset(client, "browseroutput", "is-disabled=1;is-visible=0")
|
||||
client.tgui_panel.oldchat = TRUE
|
||||
|
||||
if (client?.tgui_panel?.is_ready())
|
||||
// Send a soft ping
|
||||
client.tgui_panel.window.send_message("ping/soft", list(
|
||||
// Slightly less than the subsystem timer (somewhat arbitrary)
|
||||
// to prevent incoming pings from resetting the afk state
|
||||
"afk" = client.is_afk(3.5 SECONDS),
|
||||
))
|
||||
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
@@ -2,7 +2,6 @@
|
||||
* Copyright (c) 2020 Aleksej Komarov
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
/**
|
||||
* tgui subsystem
|
||||
*
|
||||
@@ -38,7 +37,7 @@ SUBSYSTEM_DEF(tgui)
|
||||
/datum/controller/subsystem/tgui/stat_entry()
|
||||
..("P:[all_uis.len]")
|
||||
|
||||
/datum/controller/subsystem/tgui/fire(resumed = FALSE)
|
||||
/datum/controller/subsystem/tgui/fire(resumed = 0)
|
||||
if(!resumed)
|
||||
src.current_run = all_uis.Copy()
|
||||
// Cache for sanic speed (lists are references anyways)
|
||||
@@ -47,8 +46,8 @@ SUBSYSTEM_DEF(tgui)
|
||||
var/datum/tgui/ui = current_run[current_run.len]
|
||||
current_run.len--
|
||||
// TODO: Move user/src_object check to process()
|
||||
if(ui?.user && ui.src_object)
|
||||
ui.process(wait * 0.1)
|
||||
if(ui && ui.user && ui.src_object)
|
||||
ui.process()
|
||||
else
|
||||
ui.close(0)
|
||||
if(MC_TICK_CHECK)
|
||||
@@ -87,8 +86,6 @@ SUBSYSTEM_DEF(tgui)
|
||||
window_found = TRUE
|
||||
break
|
||||
if(!window_found)
|
||||
log_tgui(user, "Error: Pool exhausted",
|
||||
context = "SStgui/request_pooled_window")
|
||||
return null
|
||||
return window
|
||||
|
||||
@@ -100,7 +97,6 @@ SUBSYSTEM_DEF(tgui)
|
||||
* required user mob
|
||||
*/
|
||||
/datum/controller/subsystem/tgui/proc/force_close_all_windows(mob/user)
|
||||
log_tgui(user, context = "SStgui/force_close_all_windows")
|
||||
if(user.client)
|
||||
user.client.tgui_windows = list()
|
||||
for(var/i in 1 to TGUI_WINDOW_HARD_LIMIT)
|
||||
@@ -116,7 +112,6 @@ SUBSYSTEM_DEF(tgui)
|
||||
* required window_id string
|
||||
*/
|
||||
/datum/controller/subsystem/tgui/proc/force_close_window(mob/user, window_id)
|
||||
log_tgui(user, context = "SStgui/force_close_window")
|
||||
// Close all tgui datums based on window_id.
|
||||
for(var/datum/tgui/ui in user.tgui_open_uis)
|
||||
if(ui.window && ui.window.id == window_id)
|
||||
@@ -126,23 +121,22 @@ SUBSYSTEM_DEF(tgui)
|
||||
// Close window directly just to be sure.
|
||||
user << browse(null, "window=[window_id]")
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Try to find an instance of a UI, and push an update to it.
|
||||
*
|
||||
* required user mob The mob who opened/is using the UI.
|
||||
* required src_object datum The object/datum which owns the UI.
|
||||
* optional ui datum/tgui The UI to be updated, if it exists.
|
||||
* optional force_open bool If the UI should be re-opened instead of updated.
|
||||
*
|
||||
* return datum/tgui The found UI.
|
||||
*/
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Get a open UI given a user, src_object, and ui_key and try to update it with data.
|
||||
*
|
||||
* required user mob The mob who opened/is using the UI.
|
||||
* required src_object datum The object/datum which owns the UI.
|
||||
* required ui_key string The ui_key of the UI.
|
||||
*
|
||||
* return datum/tgui The found UI.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/try_update_ui(
|
||||
mob/user,
|
||||
datum/src_object,
|
||||
datum/tgui/ui)
|
||||
// Look up a UI if it wasn't passed
|
||||
// Look up a UI if it wasn't passed.
|
||||
if(isnull(ui))
|
||||
ui = get_open_ui(user, src_object)
|
||||
// Couldn't find a UI.
|
||||
@@ -158,16 +152,17 @@ SUBSYSTEM_DEF(tgui)
|
||||
ui.send_update()
|
||||
return ui
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Get a open UI given a user and src_object.
|
||||
*
|
||||
* required user mob The mob who opened/is using the UI.
|
||||
* required src_object datum The object/datum which owns the UI.
|
||||
*
|
||||
* return datum/tgui The found UI.
|
||||
*/
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Get a open UI given a user, src_object, and ui_key.
|
||||
*
|
||||
* required user mob The mob who opened/is using the UI.
|
||||
* required src_object datum The object/datum which owns the UI.
|
||||
* required ui_key string The ui_key of the UI.
|
||||
*
|
||||
* return datum/tgui The found UI.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/get_open_ui(mob/user, datum/src_object)
|
||||
// No UIs opened for this src_object
|
||||
if(!LAZYLEN(src_object?.open_uis))
|
||||
@@ -176,57 +171,56 @@ SUBSYSTEM_DEF(tgui)
|
||||
// Make sure we have the right user
|
||||
if(ui.user == user)
|
||||
return ui
|
||||
return null
|
||||
return null // Couldn't find a UI!
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Update all UIs attached to src_object.
|
||||
*
|
||||
* required src_object datum The object/datum which owns the UIs.
|
||||
*
|
||||
* return int The number of UIs updated.
|
||||
*/
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Update all UIs attached to src_object.
|
||||
*
|
||||
* required src_object datum The object/datum which owns the UIs.
|
||||
*
|
||||
* return int The number of UIs updated.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/update_uis(datum/src_object)
|
||||
// No UIs opened for this src_object
|
||||
if(!LAZYLEN(src_object?.open_uis))
|
||||
return 0
|
||||
var/count = 0
|
||||
for(var/datum/tgui/ui in src_object.open_uis)
|
||||
// Check if UI is valid.
|
||||
if(ui?.src_object && ui.user && ui.src_object.tgui_host(ui.user))
|
||||
// Check the UI is valid.
|
||||
if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user))
|
||||
INVOKE_ASYNC(ui, TYPE_PROC_REF(/datum/tgui, process), wait * 0.1, TRUE)
|
||||
count++
|
||||
count++ // Count each UI we update.
|
||||
return count
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Close all UIs attached to src_object.
|
||||
*
|
||||
* required src_object datum The object/datum which owns the UIs.
|
||||
*
|
||||
* return int The number of UIs closed.
|
||||
*/
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Close all UIs attached to src_object.
|
||||
*
|
||||
* required src_object datum The object/datum which owns the UIs.
|
||||
*
|
||||
* return int The number of UIs closed.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/close_uis(datum/src_object)
|
||||
// No UIs opened for this src_object
|
||||
if(!LAZYLEN(src_object?.open_uis))
|
||||
return 0
|
||||
var/count = 0
|
||||
for(var/datum/tgui/ui in src_object.open_uis)
|
||||
// Check if UI is valid.
|
||||
if(ui?.src_object && ui.user && ui.src_object.tgui_host(ui.user))
|
||||
ui.close()
|
||||
count++
|
||||
if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) // Check the UI is valid.
|
||||
ui.close() // Close the UI.
|
||||
count++ // Count each UI we close.
|
||||
return count
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Close all UIs regardless of their attachment to src_object.
|
||||
*
|
||||
* return int The number of UIs closed.
|
||||
*/
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Close all UIs regardless of their attachment to src_object.
|
||||
*
|
||||
* return int The number of UIs closed.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/close_all_uis()
|
||||
var/count = 0
|
||||
for(var/datum/tgui/ui in all_uis)
|
||||
@@ -236,67 +230,67 @@ SUBSYSTEM_DEF(tgui)
|
||||
count++
|
||||
return count
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Update all UIs belonging to a user.
|
||||
*
|
||||
* required user mob The mob who opened/is using the UI.
|
||||
* optional src_object datum If provided, only update UIs belonging this src_object.
|
||||
*
|
||||
* return int The number of UIs updated.
|
||||
*/
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Update all UIs belonging to a user.
|
||||
*
|
||||
* required user mob The mob who opened/is using the UI.
|
||||
* optional src_object datum If provided, only update UIs belonging this src_object.
|
||||
*
|
||||
* return int The number of UIs updated.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/update_user_uis(mob/user, datum/src_object)
|
||||
var/count = 0
|
||||
if(length(user?.tgui_open_uis) == 0)
|
||||
return count
|
||||
for(var/datum/tgui/ui in user.tgui_open_uis)
|
||||
if(isnull(src_object) || ui.src_object == src_object)
|
||||
ui.process(wait * 0.1, force = 1)
|
||||
ui.process(force = 1)
|
||||
count++
|
||||
return count
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Close all UIs belonging to a user.
|
||||
*
|
||||
* required user mob The mob who opened/is using the UI.
|
||||
* optional src_object datum If provided, only close UIs belonging this src_object.
|
||||
*
|
||||
* return int The number of UIs closed.
|
||||
*/
|
||||
/datum/controller/subsystem/tgui/proc/close_user_uis(mob/user, datum/src_object)
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Close all UIs belonging to a user.
|
||||
*
|
||||
* required user mob The mob who opened/is using the UI.
|
||||
* optional src_object datum If provided, only close UIs belonging this src_object.
|
||||
*
|
||||
* return int The number of UIs closed.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/close_user_uis(mob/user, datum/src_object, logout = FALSE)
|
||||
var/count = 0
|
||||
if(length(user?.tgui_open_uis) == 0)
|
||||
return count
|
||||
for(var/datum/tgui/ui in user.tgui_open_uis)
|
||||
if(isnull(src_object) || ui.src_object == src_object)
|
||||
ui.close()
|
||||
ui.close(logout = logout)
|
||||
count++
|
||||
return count
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Add a UI to the list of open UIs.
|
||||
*
|
||||
* required ui datum/tgui The UI to be added.
|
||||
*/
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Add a UI to the list of open UIs.
|
||||
*
|
||||
* required ui datum/tgui The UI to be added.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/on_open(datum/tgui/ui)
|
||||
ui.user?.tgui_open_uis |= ui
|
||||
LAZYOR(ui.src_object.open_uis, ui)
|
||||
all_uis |= ui
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Remove a UI from the list of open UIs.
|
||||
*
|
||||
* required ui datum/tgui The UI to be removed.
|
||||
*
|
||||
* return bool If the UI was removed or not.
|
||||
*/
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Remove a UI from the list of open UIs.
|
||||
*
|
||||
* required ui datum/tgui The UI to be removed.
|
||||
*
|
||||
* return bool If the UI was removed or not.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/on_close(datum/tgui/ui)
|
||||
// Remove it from the list of processing UIs.
|
||||
all_uis -= ui
|
||||
@@ -308,28 +302,28 @@ SUBSYSTEM_DEF(tgui)
|
||||
LAZYREMOVE(ui.src_object.open_uis, ui)
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Handle client logout, by closing all their UIs.
|
||||
*
|
||||
* required user mob The mob which logged out.
|
||||
*
|
||||
* return int The number of UIs closed.
|
||||
*/
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Handle client logout, by closing all their UIs.
|
||||
*
|
||||
* required user mob The mob which logged out.
|
||||
*
|
||||
* return int The number of UIs closed.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/on_logout(mob/user)
|
||||
close_user_uis(user)
|
||||
return close_user_uis(user, logout = TRUE)
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Handle clients switching mobs, by transferring their UIs.
|
||||
*
|
||||
* required user source The client's original mob.
|
||||
* required user target The client's new mob.
|
||||
*
|
||||
* return bool If the UIs were transferred.
|
||||
*/
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Handle clients switching mobs, by transferring their UIs.
|
||||
*
|
||||
* required user source The client's original mob.
|
||||
* required user target The client's new mob.
|
||||
*
|
||||
* return bool If the UIs were transferred.
|
||||
**/
|
||||
/datum/controller/subsystem/tgui/proc/on_transfer(mob/source, mob/target)
|
||||
// The old mob had no open UIs.
|
||||
if(length(source?.tgui_open_uis) == 0)
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
/// Stores information about a chat payload
|
||||
/datum/chat_payload
|
||||
/// Sequence number of this payload
|
||||
var/sequence = 0
|
||||
/// Message we are sending
|
||||
var/list/content
|
||||
/// Resend count
|
||||
var/resends = 0
|
||||
|
||||
/// Converts the chat payload into a JSON string
|
||||
/datum/chat_payload/proc/into_message()
|
||||
return "{\"sequence\":[sequence],\"content\":[json_encode(content)]}"
|
||||
|
||||
/// Returns an HTML-encoded message from our contents.
|
||||
/datum/chat_payload/proc/get_content_as_html()
|
||||
return message_to_html(content)
|
||||
@@ -95,14 +95,4 @@
|
||||
/datum/category_item/underwear/bottom/onepiece
|
||||
name = "Swimming One Piece"
|
||||
icon_state = "onepiece"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/top/onepiece_alt
|
||||
name = "Swimming One Piece, Alt"
|
||||
icon_state = "swim_onepiece"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/top/onepiece_strapless
|
||||
name = "Swimming One Piece, Strapless"
|
||||
icon_state = "swim_strapless_onepiece"
|
||||
has_color = TRUE
|
||||
has_color = TRUE
|
||||
@@ -208,8 +208,4 @@
|
||||
/datum/category_item/underwear/socks/stirrup_thigh_black
|
||||
name = "Black Stirrup Stockings"
|
||||
icon_state = "leggings-stir-black"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/socks/stirrup_pantyhose
|
||||
name = "Pantyhose, stirrup"
|
||||
icon_state = "pantyhose-stir"
|
||||
has_color = TRUE
|
||||
@@ -51,20 +51,10 @@
|
||||
name = "Fishnet top"
|
||||
icon_state = "fishnet_body"
|
||||
|
||||
/datum/category_item/underwear/top/fishnet_base_alt
|
||||
name = "Fishnet top, alt"
|
||||
icon_state = "fishnet_body_alt"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/top/fishnet_sleeves
|
||||
name = "Fishnet with sleeves"
|
||||
icon_state = "fishnet_sleeves"
|
||||
|
||||
/datum/category_item/underwear/top/fishnet_sleeves_alt
|
||||
name = "Fishnet with sleeves, alt"
|
||||
icon_state = "fishnet_sleeves_alt"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/top/fishnet_gloves
|
||||
name = "Fishnet with gloves"
|
||||
icon_state = "fishnet_gloves"
|
||||
@@ -105,4 +95,4 @@
|
||||
/datum/category_item/underwear/top/swimtop
|
||||
name = "Swimming Top"
|
||||
icon_state = "swimtop"
|
||||
has_color = TRUE
|
||||
has_color = TRUE
|
||||
@@ -189,38 +189,13 @@
|
||||
icon_state = "pinkblack_tshirt"
|
||||
|
||||
/datum/category_item/underwear/undershirt/turtle
|
||||
name = "Turtleneck, Old"
|
||||
icon_state = "turtleneck_old"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/sleevelessturtle
|
||||
name = "Turtleneck, Sleeveless, Old"
|
||||
icon_state = "turtleneck_sleeveless_old"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/turtleneck
|
||||
name = "Turtleneck"
|
||||
icon_state = "turtleneck"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/turtleneck_smooth
|
||||
name = "Turtleneck, Smooth"
|
||||
icon_state = "turtleneck_smooth"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/turtlesleeveless
|
||||
/datum/category_item/underwear/undershirt/sleevelessturtle
|
||||
name = "Turtleneck, Sleeveless"
|
||||
icon_state = "turtleneck_sleeveless"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/leotardturtle
|
||||
name = "Leotard Turtleneck"
|
||||
icon_state = "leotard_turtleneck"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/leotardturtlesleeveless
|
||||
name = "Leotard Turtleneck, Sleeveless"
|
||||
icon_state = "leotard_turtleneck_sleeveless"
|
||||
icon_state = "sleevelessturtle"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/dress_shirt_fem
|
||||
@@ -251,4 +226,4 @@
|
||||
/datum/category_item/underwear/undershirt/leotard
|
||||
name = "Leotard"
|
||||
icon_state = "leotard"
|
||||
has_color = TRUE
|
||||
has_color = TRUE
|
||||
@@ -374,7 +374,7 @@
|
||||
"backkey"=IS_SCREWDRIVER,
|
||||
"desc"="The wiring is adjusted"),
|
||||
//17
|
||||
list("key"=IS_WIRECUTTER,
|
||||
list("key"=/obj/item/weapon/tool/wirecutters,
|
||||
"backkey"=IS_SCREWDRIVER,
|
||||
"desc"="The wiring is added"),
|
||||
//18
|
||||
@@ -656,7 +656,7 @@
|
||||
"backkey"=IS_SCREWDRIVER,
|
||||
"desc"="The wiring is adjusted"),
|
||||
//17
|
||||
list("key"=IS_WIRECUTTER,
|
||||
list("key"=/obj/item/weapon/tool/wirecutters,
|
||||
"backkey"=IS_SCREWDRIVER,
|
||||
"desc"="The wiring is added"),
|
||||
//18
|
||||
@@ -919,7 +919,7 @@
|
||||
"backkey"=IS_SCREWDRIVER,
|
||||
"desc"="The wiring is adjusted"),
|
||||
//12
|
||||
list("key"=IS_WIRECUTTER,
|
||||
list("key"=/obj/item/weapon/tool/wirecutters,
|
||||
"backkey"=IS_SCREWDRIVER,
|
||||
"desc"="The wiring is added"),
|
||||
//13
|
||||
@@ -1159,7 +1159,7 @@
|
||||
"backkey"=IS_SCREWDRIVER,
|
||||
"desc"="The wiring is adjusted"),
|
||||
//17
|
||||
list("key"=IS_WIRECUTTER,
|
||||
list("key"=/obj/item/weapon/tool/wirecutters,
|
||||
"backkey"=IS_SCREWDRIVER,
|
||||
"desc"="The wiring is added"),
|
||||
//18
|
||||
@@ -1417,7 +1417,7 @@
|
||||
"backkey"=IS_SCREWDRIVER,
|
||||
"desc"="The wiring is adjusted"),
|
||||
//11
|
||||
list("key"=IS_WIRECUTTER,
|
||||
list("key"=/obj/item/weapon/tool/wirecutters,
|
||||
"backkey"=IS_SCREWDRIVER,
|
||||
"desc"="The wiring is added"),
|
||||
//12
|
||||
@@ -1650,7 +1650,7 @@
|
||||
"backkey"=IS_SCREWDRIVER,
|
||||
"desc"="The wiring is adjusted"),
|
||||
//17
|
||||
list("key"=IS_WIRECUTTER,
|
||||
list("key"=/obj/item/weapon/tool/wirecutters,
|
||||
"backkey"=IS_SCREWDRIVER,
|
||||
"desc"="The wiring is added"),
|
||||
//18
|
||||
@@ -1937,7 +1937,7 @@
|
||||
"backkey"=IS_SCREWDRIVER,
|
||||
"desc"="The wiring is adjusted"),
|
||||
//19
|
||||
list("key"=IS_WIRECUTTER,
|
||||
list("key"=/obj/item/weapon/tool/wirecutters,
|
||||
"backkey"=IS_SCREWDRIVER,
|
||||
"desc"="The wiring is added"),
|
||||
//20
|
||||
|
||||
@@ -226,7 +226,6 @@
|
||||
|
||||
/obj/item/attack_hand(mob/living/user as mob)
|
||||
if (!user) return
|
||||
..()
|
||||
if(anchored)
|
||||
to_chat(user, span("notice", "\The [src] won't budge, you can't pick it up!"))
|
||||
return
|
||||
@@ -1021,4 +1020,4 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen
|
||||
return
|
||||
|
||||
/obj/item/proc/get_welder()
|
||||
return
|
||||
return
|
||||
@@ -132,14 +132,13 @@
|
||||
to_chat(user, "<span class='warning'>You MUST put the paper on a table!</span>")
|
||||
if (W.w_class < ITEMSIZE_LARGE)
|
||||
var/obj/item/I = user.get_inactive_hand()
|
||||
if(I && I.has_tool_quality(TOOL_WIRECUTTER))
|
||||
if(I.has_tool_quality(TOOL_WIRECUTTER))
|
||||
var/a_used = 2 ** (src.w_class - 1)
|
||||
if (src.amount < a_used)
|
||||
to_chat(user, "<span class='warning'>You need more paper!</span>")
|
||||
return
|
||||
else
|
||||
if(istype(W, /obj/item/smallDelivery) || istype(W, /obj/item/weapon/gift)) //No gift wrapping gifts!
|
||||
to_chat(user, "<span class='warning'>You can't wrap something that's already wrapped!</span>")
|
||||
return
|
||||
|
||||
src.amount -= a_used
|
||||
|
||||
@@ -55,7 +55,6 @@
|
||||
desc = initial(desc) + " It's fitted with a prying head."
|
||||
icon_state = "jaws_pry"
|
||||
usesound = 'sound/items/jaws_pry.ogg'
|
||||
pry = 1
|
||||
tool_qualities = list(TOOL_CROWBAR)
|
||||
if(user)
|
||||
playsound(src, 'sound/items/change_jaws.ogg', 50, 1)
|
||||
@@ -64,7 +63,6 @@
|
||||
desc = initial(desc) + " It's fitted with a cutting head."
|
||||
icon_state = "jaws_cutter"
|
||||
usesound = 'sound/items/jaws_cut.ogg'
|
||||
pry = 0
|
||||
tool_qualities = list(TOOL_WIRECUTTER)
|
||||
if(user)
|
||||
playsound(src, 'sound/items/change_jaws.ogg', 50, 1)
|
||||
|
||||
@@ -185,22 +185,22 @@
|
||||
user.do_attack_animation(src)
|
||||
shatter()
|
||||
|
||||
else if (user.a_intent == I_HURT)
|
||||
else if (usr.a_intent == I_HURT)
|
||||
|
||||
if (istype(user,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if (istype(usr,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(H.species.can_shred(H))
|
||||
attack_generic(H,25)
|
||||
return
|
||||
|
||||
playsound(src, 'sound/effects/glassknock.ogg', 80, 1)
|
||||
user.do_attack_animation(src)
|
||||
user.visible_message("<span class='danger'>\The [user] bangs against \the [src]!</span>",
|
||||
usr.visible_message("<span class='danger'>\The [usr] bangs against \the [src]!</span>",
|
||||
"<span class='danger'>You bang against \the [src]!</span>",
|
||||
"You hear a banging sound.")
|
||||
else
|
||||
playsound(src, 'sound/effects/glassknock.ogg', 80, 1)
|
||||
user.visible_message("[user.name] knocks on the [src.name].",
|
||||
usr.visible_message("[usr.name] knocks on the [src.name].",
|
||||
"You knock on the [src.name].",
|
||||
"You hear a knocking sound.")
|
||||
return
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
GLOB.timezoneOffset = get_timezone_offset()
|
||||
|
||||
callHook("startup")
|
||||
init_vchat()
|
||||
//Emergency Fix
|
||||
load_mods()
|
||||
//end-emergency fix
|
||||
@@ -506,7 +507,7 @@ var/world_topic_spam_protect_time = world.timeofday
|
||||
|
||||
s += "<b>[station_name()]</b>";
|
||||
s += " ("
|
||||
s += "<a href=\"https://\">" //Change this to wherever you want the hub to link to.
|
||||
s += "<a href=\"http://\">" //Change this to wherever you want the hub to link to.
|
||||
// s += "[game_version]"
|
||||
s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version.
|
||||
s += "</a>"
|
||||
|
||||
@@ -8,10 +8,7 @@ var/global/floorIsLava = 0
|
||||
|
||||
for(var/client/C in GLOB.admins)
|
||||
if((R_ADMIN|R_MOD) & C.holder.rights)
|
||||
to_chat(C,
|
||||
type = MESSAGE_TYPE_ADMINLOG,
|
||||
html = msg,
|
||||
confidential = TRUE)
|
||||
to_chat(C,msg)
|
||||
|
||||
/proc/msg_admin_attack(var/text) //Toggleable Attack Messages
|
||||
var/rendered = "<span class='filter_attacklog log_message'><span class='prefix'>ATTACK:</span> <span class=\"message\">[text]</span></span>"
|
||||
@@ -19,10 +16,7 @@ var/global/floorIsLava = 0
|
||||
if((R_ADMIN|R_MOD) & C.holder.rights)
|
||||
if(C.is_preference_enabled(/datum/client_preference/mod/show_attack_logs))
|
||||
var/msg = rendered
|
||||
to_chat(C,
|
||||
type = MESSAGE_TYPE_ATTACKLOG,
|
||||
html = msg,
|
||||
confidential = TRUE)
|
||||
to_chat(C,msg)
|
||||
|
||||
/proc/admin_notice(var/message, var/rights)
|
||||
for(var/mob/M in mob_list)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(!istype(target) || !target.module)
|
||||
if(!istype(target))
|
||||
return
|
||||
|
||||
if(!target.module.modules)
|
||||
@@ -45,7 +45,6 @@
|
||||
robot.module.contents.Remove(add_item)
|
||||
target.module.modules.Add(add_item)
|
||||
target.module.contents.Add(add_item)
|
||||
target.hud_used.update_robot_modules_display()
|
||||
to_chat(usr, "<span class='danger'>You added \"[add_item]\" to [target].</span>")
|
||||
if(istype(add_item, /obj/item/stack/))
|
||||
var/obj/item/stack/item_with_synth = add_item
|
||||
@@ -95,8 +94,6 @@
|
||||
if(!istype(selected_module_module, /obj/item/))
|
||||
break
|
||||
to_chat(usr, "<span class='danger'>You removed \"[selected_module_module]\" from [target]</span>")
|
||||
target.uneq_all()
|
||||
target.hud_used.update_robot_modules_display(TRUE)
|
||||
target.module.emag.Remove(selected_module_module)
|
||||
target.module.modules.Remove(selected_module_module)
|
||||
target.module.contents.Remove(selected_module_module)
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(R_ADMIN|R_EVENT & C.holder.rights)
|
||||
if(C.is_preference_enabled(/datum/client_preference/admin/show_chat_prayers))
|
||||
to_chat(C, msg, type = MESSAGE_TYPE_PRAYER, confidential = TRUE)
|
||||
to_chat(C,msg)
|
||||
C << 'sound/effects/ding.ogg'
|
||||
to_chat(usr, "Your prayers have been received by the gods.", confidential = TRUE)
|
||||
to_chat(usr, "Your prayers have been received by the gods.")
|
||||
|
||||
feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
log_pray(raw_msg, src)
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
/datum/asset/spritesheet/chat
|
||||
name = "chat"
|
||||
@@ -5,9 +5,11 @@
|
||||
"tgui.bundle.css" = file("tgui/public/tgui.bundle.css"),
|
||||
)
|
||||
|
||||
/* Comment will be removed in later part
|
||||
/datum/asset/simple/tgui_panel
|
||||
// keep_local_name = TRUE
|
||||
assets = list(
|
||||
"tgui-panel.bundle.js" = file("tgui/public/tgui-panel.bundle.js"),
|
||||
"tgui-panel.bundle.css" = file("tgui/public/tgui-panel.bundle.css"),
|
||||
)
|
||||
*/
|
||||
|
||||
@@ -41,10 +41,8 @@
|
||||
var/datum/admins/deadmin_holder = null
|
||||
var/buildmode = 0
|
||||
|
||||
///Contains the last message sent by this client - used to protect against copy-paste spamming.
|
||||
var/last_message = ""
|
||||
///contins a number of how many times a message identical to last_message was sent.
|
||||
var/last_message_count = 0
|
||||
var/last_message = "" //Contains the last message sent by this client - used to protect against copy-paste spamming.
|
||||
var/last_message_count = 0 //contins a number of how many times a message identical to last_message was sent.
|
||||
var/ircreplyamount = 0
|
||||
var/entity_narrate_holder //Holds /datum/entity_narrate when using the relevant admin verbs.
|
||||
|
||||
@@ -58,7 +56,9 @@
|
||||
var/area = null
|
||||
var/time_died_as_mouse = null //when the client last died as a mouse
|
||||
var/datum/tooltip/tooltips = null
|
||||
var/datum/chatOutput/chatOutput
|
||||
var/datum/volume_panel/volume_panel = null // Initialized by /client/verb/volume_panel()
|
||||
var/chatOutputLoadedAt
|
||||
var/seen_news = 0
|
||||
|
||||
var/adminhelped = 0
|
||||
|
||||
@@ -133,6 +133,7 @@
|
||||
if("usr") hsrc = mob
|
||||
if("prefs") return prefs.process_link(usr,href_list)
|
||||
if("vars") return view_var_Topic(href,href_list,hsrc)
|
||||
if("chat") return chatOutput.Topic(href, href_list)
|
||||
|
||||
switch(href_list["action"])
|
||||
if("openLink")
|
||||
@@ -167,10 +168,15 @@
|
||||
return null
|
||||
|
||||
if(!config.guests_allowed && IsGuestKey(key))
|
||||
alert(src,"This server doesn't allow guest accounts to play. Please go to https://www.byond.com/ and register for a key.","Guest") // Not tgui_alert
|
||||
alert(src,"This server doesn't allow guest accounts to play. Please go to http://www.byond.com/ and register for a key.","Guest") // Not tgui_alert
|
||||
del(src)
|
||||
return
|
||||
|
||||
chatOutput = new /datum/chatOutput(src) //veechat
|
||||
chatOutput.send_resources()
|
||||
spawn()
|
||||
chatOutput.start()
|
||||
|
||||
//Only show this if they are put into a new_player mob. Otherwise, "what title screen?"
|
||||
if(isnewplayer(src.mob))
|
||||
to_chat(src, "<font color='red'>If the title screen is black, resources are still downloading. Please be patient until the title screen appears.</font>")
|
||||
@@ -178,9 +184,6 @@
|
||||
GLOB.clients += src
|
||||
GLOB.directory[ckey] = src
|
||||
|
||||
// Instantiate tgui panel
|
||||
tgui_panel = new(src, "browseroutput")
|
||||
|
||||
GLOB.ahelp_tickets.ClientLogin(src)
|
||||
GLOB.mhelp_tickets.ClientLogin(src)
|
||||
|
||||
@@ -210,9 +213,6 @@
|
||||
if(prefs)
|
||||
prefs.selecting_slots = FALSE
|
||||
|
||||
// Initialize tgui panel
|
||||
tgui_panel.initialize()
|
||||
|
||||
connection_time = world.time
|
||||
connection_realtime = world.realtime
|
||||
connection_timeofday = world.timeofday
|
||||
@@ -484,11 +484,34 @@
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/client/verb/reload_vchat()
|
||||
set name = "Reload VChat"
|
||||
set category = "OOC"
|
||||
|
||||
//Timing
|
||||
if(src.chatOutputLoadedAt > (world.time - 10 SECONDS))
|
||||
tgui_alert_async(src, "You can only try to reload VChat every 10 seconds at most.")
|
||||
return
|
||||
|
||||
verbs -= /client/proc/vchat_export_log
|
||||
|
||||
//Log, disable
|
||||
log_debug("[key_name(src)] reloaded VChat.")
|
||||
winset(src, null, "outputwindow.htmloutput.is-visible=false;outputwindow.oldoutput.is-visible=false;outputwindow.chatloadlabel.is-visible=true")
|
||||
|
||||
//The hard way
|
||||
qdel_null(src.chatOutput)
|
||||
chatOutput = new /datum/chatOutput(src) //veechat
|
||||
chatOutput.send_resources()
|
||||
spawn()
|
||||
chatOutput.start()
|
||||
|
||||
|
||||
//This is for getipintel.net.
|
||||
//You're welcome to replace this proc with your own that does your own cool stuff.
|
||||
//Just set the client's ip_reputation var and make sure it makes sense with your config settings (higher numbers are worse results)
|
||||
/client/proc/update_ip_reputation()
|
||||
var/request = "https://check.getipintel.net/check.php?ip=[address]&contact=[config.ipr_email]"
|
||||
var/request = "http://check.getipintel.net/check.php?ip=[address]&contact=[config.ipr_email]"
|
||||
var/http[] = world.Export(request)
|
||||
|
||||
/* Debug
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
if(!config.ipr_email)
|
||||
return -1
|
||||
|
||||
var/request = "https://check.getipintel.net/check.php?ip=[address]&contact=[config.ipr_email]"
|
||||
var/request = "http://check.getipintel.net/check.php?ip=[address]&contact=[config.ipr_email]"
|
||||
var/http[] = world.Export(request)
|
||||
|
||||
if(!http || !islist(http)) //If we couldn't check, the service might be down, fail-safe.
|
||||
@@ -74,7 +74,7 @@
|
||||
if(!config.ipqualityscore_apikey)
|
||||
return -1
|
||||
|
||||
var/request = "https://www.ipqualityscore.com/api/json/ip/[config.ipqualityscore_apikey]/[address]?strictness=1&fast=true&byond_key=[key]"
|
||||
var/request = "http://www.ipqualityscore.com/api/json/ip/[config.ipqualityscore_apikey]/[address]?strictness=1&fast=true&byond_key=[key]"
|
||||
var/http[] = world.Export(request)
|
||||
|
||||
if(!http || !islist(http)) //If we couldn't check, the service might be down, fail-safe.
|
||||
@@ -97,4 +97,4 @@
|
||||
else
|
||||
score = response["fraud_score"]
|
||||
|
||||
return score/100 //To normalize with the 0.0 to 1.0 scores.
|
||||
return score/100 //To normalize with the 0.0 to 1.0 scores.
|
||||
@@ -22,33 +22,6 @@
|
||||
S["communicator_visibility"] << pref.communicator_visibility
|
||||
S["ringtone"] << pref.ringtone
|
||||
|
||||
var/global/list/valid_ringtones = list(
|
||||
"beep",
|
||||
"boom",
|
||||
"slip",
|
||||
"honk",
|
||||
"SKREE",
|
||||
"xeno",
|
||||
"spark",
|
||||
"rad",
|
||||
"servo",
|
||||
"buh-boop",
|
||||
"trombone",
|
||||
"whistle",
|
||||
"chirp",
|
||||
"slurp",
|
||||
"pwing",
|
||||
"clack",
|
||||
"bzzt",
|
||||
"chimes",
|
||||
"prbt",
|
||||
"bark",
|
||||
"bork",
|
||||
"roark",
|
||||
"chitter",
|
||||
"squish"
|
||||
)
|
||||
|
||||
// Moved from /datum/preferences/proc/copy_to()
|
||||
/datum/category_item/player_setup_item/general/equipment/copy_to_mob(var/mob/living/carbon/human/character)
|
||||
character.all_underwear.Cut()
|
||||
@@ -178,15 +151,8 @@ var/global/list/valid_ringtones = list(
|
||||
pref.communicator_visibility = !pref.communicator_visibility
|
||||
return TOPIC_REFRESH
|
||||
else if(href_list["set_ringtone"])
|
||||
var/choice = tgui_input_list(user, "Please select a ringtone. All of these choices come with an associated preset sound. Alternately, select \"Other\" to specify manually.", "Character Preference", valid_ringtones + "Other", pref.ringtone)
|
||||
if(!choice || !CanUseTopic(user))
|
||||
return TOPIC_NOACTION
|
||||
if(choice == "Other")
|
||||
var/raw_choice = sanitize(tgui_input_text(user, "Please enter a custom ringtone. If this doesn't match any of the other listed choices, your PDA will use the default (\"beep\") sound.", "Character Preference", null, 20), 20)
|
||||
if(raw_choice && CanUseTopic(user))
|
||||
pref.ringtone = raw_choice
|
||||
else
|
||||
pref.ringtone = choice
|
||||
return TOPIC_REFRESH
|
||||
if(CanUseTopic(user))
|
||||
pref.ringtone = sanitize(input(user, "Please enter a new ringtone.", "Character Preference") as null|text, 20)
|
||||
return TOPIC_REFRESH
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -289,7 +289,7 @@ var/list/_client_preferences_by_type
|
||||
key = "SOUND_INSTRUMENT"
|
||||
|
||||
/datum/client_preference/vchat_enable
|
||||
description = "Enable/Disable TGChat"
|
||||
description = "Enable/Disable VChat"
|
||||
key = "VCHAT_ENABLE"
|
||||
enabled_description = "Enabled"
|
||||
disabled_description = "Disabled"
|
||||
|
||||
@@ -76,7 +76,3 @@
|
||||
|
||||
/datum/gear/mask/lace/New()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/mask/half
|
||||
display_name = "black half-mask"
|
||||
path = /obj/item/clothing/accessory/gaiter/half
|
||||
|
||||
@@ -497,10 +497,6 @@
|
||||
)
|
||||
gear_tweaks += new/datum/gear_tweak/path(cowboy_outfits)
|
||||
|
||||
/datum/gear/uniform/hightrousers
|
||||
display_name = "high-waisted trousers"
|
||||
path = /obj/item/clothing/under/dress/hightrousers
|
||||
|
||||
/*
|
||||
* 80s
|
||||
*/
|
||||
@@ -590,16 +586,3 @@
|
||||
/datum/gear/uniform/fienddress
|
||||
display_name = "fiendish dress"
|
||||
path = /obj/item/clothing/under/fienddress
|
||||
|
||||
//tabard dresses
|
||||
/datum/gear/uniform/tabarddress
|
||||
display_name = "tabard-dress selection"
|
||||
path = /obj/item/clothing/under/dress/tabard
|
||||
|
||||
/datum/gear/uniform/tabarddress/New()
|
||||
..()
|
||||
var/list/tabarddress = list(
|
||||
"white tabard-dress"=/obj/item/clothing/under/dress/tabard,
|
||||
"black tabard-dress"=/obj/item/clothing/under/dress/tabard/black
|
||||
)
|
||||
gear_tweaks += list(new/datum/gear_tweak/path(tabarddress))
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#define ORGANICS 1
|
||||
#define SYNTHETICS 2
|
||||
|
||||
var/global/list/valid_bloodreagents = list("default","iron","copper","phoron","silver","gold","slimejelly") //allowlist-based so people don't make their blood restored by alcohol or something really silly. use reagent IDs!
|
||||
var/global/list/valid_bloodreagents = list("iron","copper","phoron","silver","gold","slimejelly") //allowlist-based so people don't make their blood restored by alcohol or something really silly. use reagent IDs!
|
||||
|
||||
/datum/preferences
|
||||
var/custom_species // Custom species name, can't be changed due to it having been used in savefiles already.
|
||||
@@ -258,8 +258,7 @@ var/global/list/valid_bloodreagents = list("default","iron","copper","phoron","s
|
||||
|
||||
//Any additional non-trait settings can be applied here
|
||||
new_S.blood_color = pref.blood_color
|
||||
if(!(pref.blood_reagents == "default"))
|
||||
new_S.blood_reagents = pref.blood_reagents
|
||||
new_S.blood_reagents = pref.blood_reagents
|
||||
|
||||
if(pref.species == SPECIES_CUSTOM)
|
||||
//Statistics for this would be nice
|
||||
|
||||
@@ -48,7 +48,7 @@ var/list/preferences_datums = list()
|
||||
var/bday_announce = FALSE //Public announcement for birthdays
|
||||
var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2).
|
||||
var/b_type = "A+" //blood type (not-chooseable)
|
||||
var/blood_reagents = "default" //blood restoration reagents
|
||||
var/blood_reagents = "iron" //blood restoration reagents
|
||||
var/backbag = 2 //backpack type
|
||||
var/pdachoice = 1 //PDA type
|
||||
var/h_style = "Bald" //Hair type
|
||||
|
||||
@@ -367,17 +367,17 @@
|
||||
feedback_add_details("admin_verb","THInstm") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/toggle_vchat()
|
||||
set name = "Toggle TGChat"
|
||||
set name = "Toggle VChat"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggles TGChat. Reloading TGChat and/or reconnecting required to affect changes."
|
||||
set desc = "Toggles VChat. Reloading VChat and/or reconnecting required to affect changes."
|
||||
|
||||
var/pref_path = /datum/client_preference/vchat_enable
|
||||
toggle_preference(pref_path)
|
||||
SScharacter_setup.queue_preferences_save(prefs)
|
||||
|
||||
to_chat(src, "You have toggled TGChat [is_preference_enabled(pref_path) ? "on" : "off"]. \
|
||||
You will have to reload TGChat and/or reconnect to the server for these changes to take place. \
|
||||
TGChat message persistence is not guaranteed if you change this again before the start of the next round.")
|
||||
to_chat(src, "You have toggled VChat [is_preference_enabled(pref_path) ? "on" : "off"]. \
|
||||
You will have to reload VChat and/or reconnect to the server for these changes to take place. \
|
||||
VChat message persistence is not guaranteed if you change this again before the start of the next round.")
|
||||
|
||||
/client/verb/toggle_tgui_inputlock()
|
||||
set name = "Toggle TGUI Input Lock"
|
||||
|
||||
@@ -341,17 +341,7 @@
|
||||
"X" = image(icon = src.icon, icon_state = "xmask"),
|
||||
"Bugeyes" = image(icon = src.icon, icon_state = "bugmask"),
|
||||
"Double" = image(icon = src.icon, icon_state = "doublemask"),
|
||||
"Mark" = image(icon = src.icon, icon_state = "markmask"),
|
||||
"Line" = image(icon = src.icon, icon_state = "linemask"),
|
||||
"Minus" = image(icon = src.icon, icon_state = "minusmask"),
|
||||
"Four" = image(icon = src.icon, icon_state = "fourmask"),
|
||||
"Diamond" = image(icon = src.icon, icon_state = "diamondmask"),
|
||||
"Cat" = image(icon = src.icon, icon_state = "catmask"),
|
||||
"Big Eyes" = image(icon = src.icon, icon_state = "bigeyemask"),
|
||||
"Good" = image(icon = src.icon, icon_state = "goodmask"),
|
||||
"Bad" = image(icon = src.icon, icon_state = "badmask"),
|
||||
"Happy" = image(icon = src.icon, icon_state = "happymask"),
|
||||
"Sad" = image(icon = src.icon, icon_state = "sadmask")
|
||||
"Mark" = image(icon = src.icon, icon_state = "markmask")
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/paper/attack_self(mob/user)
|
||||
@@ -363,11 +353,7 @@
|
||||
"Sleeping" ="sleepingmask", "Heart" = "heartmask", "Core" = "coremask",
|
||||
"Plus" = "plusmask", "Square" ="squaremask", "Bullseye" = "bullseyemask",
|
||||
"Vertical" = "verticalmask", "Horizontal" = "horizontalmask", "X" ="xmask",
|
||||
"Bugeyes" = "bugmask", "Double" = "doublemask", "Mark" = "markmask",
|
||||
"Line" = "linemask", "Minus" = "minusmask", "Four" = "fourmask",
|
||||
"Diamond" = "diamondmask", "Cat" = "catmask", "Big Eyes" = "bigeyemask",
|
||||
"Good" = "goodmask", "Bad" = "badmask", "Happy" = "happymask", "Sad" = "sadmask"
|
||||
)
|
||||
"Bugeyes" = "bugmask", "Double" = "doublemask", "Mark" = "markmask")
|
||||
|
||||
var/choice = show_radial_menu(user, src, papermask_designs, custom_check = FALSE, radius = 36, require_near = TRUE)
|
||||
|
||||
@@ -419,4 +405,4 @@
|
||||
desc = "100% synthetic \"Country Girls LLC.\" brand mouth wheat. Warning: not for actual consumption."
|
||||
icon_state = "mouthwheat"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
body_parts_covered = 0
|
||||
body_parts_covered = 0
|
||||
@@ -562,10 +562,6 @@
|
||||
name = "white neck gaiter"
|
||||
icon_state = "gaiter_snow"
|
||||
|
||||
/obj/item/clothing/accessory/gaiter/half //functions like a gaiter
|
||||
name = "black half-mask"
|
||||
icon_state = "half_mask"
|
||||
|
||||
/*
|
||||
* Pride Pins
|
||||
*/
|
||||
|
||||
@@ -614,16 +614,6 @@
|
||||
desc = "Just looking at this makes you want to sing."
|
||||
icon_state = "ysing"
|
||||
|
||||
/obj/item/clothing/under/dress/tabard
|
||||
name = "white tabard-dress"
|
||||
desc = "A gold-trimmed white tabard-dress with a large V-shaped boob window. For when you want to show off your hips and look classy at the same time."
|
||||
icon_state = "white_tabard"
|
||||
|
||||
/obj/item/clothing/under/dress/tabard/black
|
||||
name = "black tabard-dress"
|
||||
desc = "A gold-trimmed black tabard-dress with a large circular boob window. For when you want to show off your hips and look classy at the same time."
|
||||
icon_state = "black_tabard"
|
||||
|
||||
/*
|
||||
* Wedding Stuff
|
||||
*/
|
||||
|
||||
@@ -75,10 +75,6 @@
|
||||
name = "black jeans short shorts"
|
||||
icon_state = "black_shorts_f"
|
||||
|
||||
/obj/item/clothing/under/shorts/black/ripped
|
||||
name = "black ripped shorts"
|
||||
icon_state = "black_shorts_ripped"
|
||||
|
||||
/obj/item/clothing/under/shorts/jeans/grey
|
||||
name = "grey jeans shorts"
|
||||
icon_state = "greyshorts"
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
if(shield_gen.deal_shield_damage(30 * severity, SHIELD_DAMTYPE_EM) <= SHIELD_BREACHED_MINOR)
|
||||
return
|
||||
if(!valid_apcs.len)
|
||||
// log_debug("No valid APCs found for electrical storm event ship=[victim]!") // Let's not spam poor people with debug logs on (me)
|
||||
log_debug("No valid APCs found for electrical storm event ship=[victim]!")
|
||||
return
|
||||
var/list/picked_apcs = list()
|
||||
for(var/i=0, i< severity * 2, i++) // up to 2/4/6 APCs per tick depending on severity
|
||||
|
||||
@@ -34,8 +34,6 @@
|
||||
SSradiation.z_radiate(locate(1, 1, z), radiation_level, 1)
|
||||
|
||||
for(var/mob/living/carbon/C in living_mob_list)
|
||||
if(!(C.z in using_map.station_levels) || C.isSynthetic() || isbelly(C.loc))
|
||||
continue
|
||||
var/area/A = get_area(C)
|
||||
if(!A)
|
||||
continue
|
||||
@@ -43,9 +41,7 @@
|
||||
continue
|
||||
if(istype(C,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = C
|
||||
var/chance = 5.0
|
||||
chance -= (chance / 100) * C.getarmor(null, "rad")
|
||||
if(prob(chance))
|
||||
if(prob(5))
|
||||
if (prob(75))
|
||||
randmutb(H) // Applies bad mutation
|
||||
domutcheck(H,null,MUTCHK_FORCED)
|
||||
|
||||
@@ -276,8 +276,8 @@ default behaviour is:
|
||||
is_shifted = FALSE
|
||||
pixel_x = default_pixel_x
|
||||
pixel_y = default_pixel_y
|
||||
layer = initial(layer)
|
||||
plane = initial(plane)
|
||||
layer = MOB_LAYER
|
||||
plane = MOB_PLANE
|
||||
// End VOREstation edit
|
||||
|
||||
if(pulling) // we were pulling a thing and didn't lose it during our move.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/weapon/melee/dogborg/jaws/big
|
||||
/obj/item/weapon/dogborg/jaws/big
|
||||
name = "combat jaws"
|
||||
icon = 'icons/mob/dogborg_vr.dmi'
|
||||
icon_state = "jaws"
|
||||
@@ -9,7 +9,7 @@
|
||||
attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
|
||||
/obj/item/weapon/melee/dogborg/jaws/small
|
||||
/obj/item/weapon/dogborg/jaws/small
|
||||
name = "puppy jaws"
|
||||
icon = 'icons/mob/dogborg_vr.dmi'
|
||||
icon_state = "smalljaws"
|
||||
@@ -21,7 +21,7 @@
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
var/emagged = 0
|
||||
|
||||
/obj/item/weapon/melee/dogborg/jaws/small/attack_self(mob/user)
|
||||
/obj/item/weapon/dogborg/jaws/small/attack_self(mob/user)
|
||||
var/mob/living/silicon/robot/R = user
|
||||
if(R.emagged || R.emag_items)
|
||||
emagged = !emagged
|
||||
@@ -48,7 +48,7 @@
|
||||
update_icon()
|
||||
|
||||
// Baton chompers
|
||||
/obj/item/weapon/melee/borg_combat_shocker
|
||||
/obj/item/weapon/borg_combat_shocker
|
||||
name = "combat shocker"
|
||||
icon = 'icons/mob/dogborg_vr.dmi'
|
||||
icon_state = "combatshocker"
|
||||
@@ -61,7 +61,7 @@
|
||||
var/charge_cost = 15
|
||||
var/dogborg = FALSE
|
||||
|
||||
/obj/item/weapon/melee/borg_combat_shocker/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
|
||||
/obj/item/weapon/borg_combat_shocker/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
|
||||
if(isrobot(target))
|
||||
return ..()
|
||||
|
||||
@@ -237,7 +237,6 @@
|
||||
icon_state = "synthtongue"
|
||||
hitsound = 'sound/effects/attackblob.ogg'
|
||||
var/emagged = 0
|
||||
var/busy = 0 //prevents abuse and runtimes
|
||||
|
||||
/obj/item/device/robot_tongue/New()
|
||||
..()
|
||||
@@ -264,27 +263,21 @@
|
||||
return
|
||||
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
if(busy)
|
||||
to_chat(user, "<span class='warning'>You are already licking something else.</span>")
|
||||
return
|
||||
if(user.client && (target in user.client.screen))
|
||||
to_chat(user, "<span class='warning'>You need to take \the [target.name] off before cleaning it!</span>")
|
||||
return
|
||||
else if(istype(target,/obj/item))
|
||||
if(istype(target,/obj/item/trash))
|
||||
user.visible_message("<span class='filter_notice'>[user] nibbles away at \the [target.name].</span>", "<span class='notice'>You begin to nibble away at \the [target.name]...</span>")
|
||||
busy = 1
|
||||
if(do_after (user, 50))
|
||||
user.visible_message("<span class='filter_notice'>[user] finishes eating \the [target.name].</span>", "<span class='notice'>You finish eating \the [target.name].</span>")
|
||||
to_chat(user, "<span class='notice'>You finish off \the [target.name].</span>")
|
||||
qdel(target)
|
||||
var/mob/living/silicon/robot/R = user
|
||||
R.cell.charge += 250
|
||||
busy = 0
|
||||
return
|
||||
if(istype(target,/obj/item/weapon/cell))
|
||||
user.visible_message("<span class='filter_notice'>[user] begins cramming \the [target.name] down its throat.</span>", "<span class='notice'>You begin cramming \the [target.name] down your throat...</span>")
|
||||
busy = 1
|
||||
if(do_after (user, 50))
|
||||
user.visible_message("<span class='filter_notice'>[user] finishes gulping down \the [target.name].</span>", "<span class='notice'>You finish swallowing \the [target.name].</span>")
|
||||
to_chat(user, "<span class='notice'>You finish off \the [target.name], and gain some charge!</span>")
|
||||
@@ -292,7 +285,6 @@
|
||||
var/obj/item/weapon/cell/C = target
|
||||
R.cell.charge += C.charge / 3
|
||||
qdel(target)
|
||||
busy = 0
|
||||
return
|
||||
else if(ishuman(target))
|
||||
if(src.emagged)
|
||||
@@ -348,13 +340,12 @@
|
||||
recharge_time = 10 //Takes ten ticks to recharge a shot, so don't waste them all!
|
||||
//cell_type = null //Same cell as a taser until edits are made.
|
||||
|
||||
/obj/item/weapon/melee/combat_borgblade
|
||||
/obj/item/weapon/combat_borgblade
|
||||
name = "energy blade"
|
||||
icon = 'icons/mob/dogborg_vr.dmi'
|
||||
icon_state = "swordtail"
|
||||
desc = "A glowing dagger. It appears to be extremely sharp."
|
||||
force = 35 //Takes 3 hits to 100-0
|
||||
armor_penetration = 70
|
||||
force = 20 //Takes 5 hits to 100-0
|
||||
sharp = TRUE
|
||||
edge = TRUE
|
||||
throwforce = 0 //This shouldn't be thrown in the first place.
|
||||
@@ -475,4 +466,4 @@
|
||||
var/armor_soak = get_armor_soak(T, "melee")
|
||||
T.apply_damage(20, HALLOSS,, armor_block, armor_soak)
|
||||
if(prob(75)) //75% chance to stun for 5 seconds, really only going to be 4 bcus click cooldown+animation.
|
||||
T.apply_effect(5, WEAKEN, armor_block)
|
||||
T.apply_effect(5, WEAKEN, armor_block)
|
||||
@@ -341,7 +341,6 @@
|
||||
hands.icon_state = get_hud_module_icon()
|
||||
feedback_inc("cyborg_[lowertext(modtype)]",1)
|
||||
updatename()
|
||||
hud_used.update_robot_modules_display()
|
||||
notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name)
|
||||
|
||||
/mob/living/silicon/robot/proc/update_braintype()
|
||||
@@ -768,7 +767,6 @@
|
||||
to_chat(usr, "<span class='filter_notice'>You apply the upgrade to [src]!</span>")
|
||||
usr.drop_item()
|
||||
U.loc = src
|
||||
hud_used.update_robot_modules_display()
|
||||
else
|
||||
to_chat(usr, "<span class='filter_notice'>Upgrade error!</span>")
|
||||
|
||||
@@ -806,13 +804,12 @@
|
||||
/mob/living/silicon/robot/proc/module_reset()
|
||||
transform_with_anim() //VOREStation edit: sprite animation
|
||||
uneq_all()
|
||||
hud_used.update_robot_modules_display(TRUE)
|
||||
modtype = initial(modtype)
|
||||
hands.icon_state = get_hud_module_icon()
|
||||
|
||||
notify_ai(ROBOT_NOTIFICATION_MODULE_RESET, module.name)
|
||||
module.Reset(src)
|
||||
module.Destroy()
|
||||
qdel(module)
|
||||
module = null
|
||||
updatename("Default")
|
||||
|
||||
@@ -1377,7 +1374,6 @@
|
||||
laws.show_laws(src)
|
||||
to_chat(src, "<span class='danger'>ALERT: [user.real_name] is your new master. Obey your new laws and [TU.his] commands.</span>")
|
||||
update_icon()
|
||||
hud_used.update_robot_modules_display()
|
||||
else
|
||||
to_chat(user, "<span class='filter_warning'>You fail to hack [src]'s interface.</span>")
|
||||
to_chat(src, "<span class='filter_warning'>Hack attempt detected.</span>")
|
||||
|
||||
@@ -760,10 +760,10 @@ var/global/list/robot_modules = list(
|
||||
src.modules += new /obj/item/weapon/gun/energy/laser/mounted(src)
|
||||
src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg/ertgun(src)
|
||||
src.modules += new /obj/item/weapon/pickaxe/plasmacutter/borg(src)
|
||||
src.modules += new /obj/item/weapon/melee/combat_borgblade(src)
|
||||
src.modules += new /obj/item/weapon/combat_borgblade(src)
|
||||
src.modules += new /obj/item/borg/combat/shield(src)
|
||||
src.modules += new /obj/item/borg/combat/mobility(src)
|
||||
src.modules += new /obj/item/weapon/melee/borg_combat_shocker(src)
|
||||
src.modules += new /obj/item/weapon/borg_combat_shocker(src)
|
||||
src.modules += new /obj/item/device/ticket_printer(src)
|
||||
src.emag += new /obj/item/weapon/gun/energy/lasercannon/mounted(src)
|
||||
|
||||
|
||||
@@ -101,11 +101,11 @@
|
||||
|
||||
..()
|
||||
|
||||
var/obj/item/weapon/melee/combat_borgblade/CBB = locate() in module.modules
|
||||
var/obj/item/weapon/combat_borgblade/CBB = locate() in module.modules
|
||||
if(CBB)
|
||||
CBB.name = "sword tail"
|
||||
CBB.desc = "A glowing dagger normally attached to the end of a cyborg's tail. It appears to be extremely sharp."
|
||||
var/obj/item/weapon/melee/borg_combat_shocker/BCS = locate() in module.modules
|
||||
var/obj/item/weapon/borg_combat_shocker/BCS = locate() in module.modules
|
||||
if(BCS)
|
||||
BCS.name = "combat jaws"
|
||||
BCS.desc = "Shockingly chompy!"
|
||||
@@ -132,4 +132,4 @@
|
||||
sprite_hud_icon_state = "ert"
|
||||
rest_sprite_options = list("Default")
|
||||
has_eye_sprites = FALSE
|
||||
has_eye_light_sprites = TRUE
|
||||
has_eye_light_sprites = TRUE
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
/obj/item/weapon/grab/proc/inspect_organ(mob/living/carbon/human/H, mob/user, var/target_zone)
|
||||
|
||||
var/obj/item/organ/external/E = H.get_organ(target_zone)
|
||||
@@ -162,12 +163,12 @@
|
||||
|
||||
if(can_eat)
|
||||
var/mob/living/carbon/attacker = user
|
||||
user.visible_message("<span class='vdanger'>[user] is attempting to devour [target]!</span>")
|
||||
user.visible_message("<span class='danger'>[user] is attempting to devour [target]!</span>")
|
||||
if(can_eat == 2)
|
||||
if(!do_mob(user, target)||!do_after(user, 30)) return
|
||||
else
|
||||
if(!do_mob(user, target)||!do_after(user, 70)) return
|
||||
user.visible_message("<span class='vdanger'>[user] devours [target]!</span>")
|
||||
user.visible_message("<span class='danger'>[user] devours [target]!</span>")
|
||||
target.loc = user
|
||||
attacker.stomach_contents.Add(target)
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
@@ -86,7 +86,7 @@ var/obj/effect/lobby_image = new /obj/effect/lobby_image
|
||||
tgui_alert_async(src, message, "BYOND Client Version Warning")
|
||||
|
||||
// So we can be more wordy and give links.
|
||||
to_chat(src, "<span class='danger'>Your client version has known issues.</span> Please consider using a different version: <a href='https://www.byond.com/download/build/'>https://www.byond.com/download/build/</a>.")
|
||||
to_chat(src, "<span class='danger'>Your client version has known issues.</span> Please consider using a different version: <a href='http://www.byond.com/download/build/'>http://www.byond.com/download/build/</a>.")
|
||||
var/chat_message = ""
|
||||
if(config.suggested_byond_version)
|
||||
chat_message += "We suggest using version [config.suggested_byond_version]."
|
||||
|
||||
@@ -234,48 +234,6 @@
|
||||
species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI)
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/bobcutovereye
|
||||
name = "Bobcut Over Eye"
|
||||
icon_state = "hair_bobcutovereye1"
|
||||
|
||||
/datum/sprite_accessory/hair/bobcutovereye2
|
||||
name = "Bobcut Over Eye 2"
|
||||
icon_state = "hair_bobcutovereye2"
|
||||
|
||||
/datum/sprite_accessory/hair/bobcutovereye3
|
||||
name = "Bobcut Over Eye 3"
|
||||
icon_state = "hair_bobcutovereye3"
|
||||
|
||||
/datum/sprite_accessory/hair/bonnie
|
||||
name = "Bonnie"
|
||||
icon_state = "hair_bonnie"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/bonniealt
|
||||
name = "Bonnie Alt"
|
||||
icon_state = "hair_bonniealt"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/bonnielong
|
||||
name = "Bonnie, Long"
|
||||
icon_state = "hair_bonnie_long"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/bonniealtlong
|
||||
name = "Bonnie Alt, Long"
|
||||
icon_state = "hair_bonniealt_long"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/bonnieshort
|
||||
name = "Bonnie, Short"
|
||||
icon_state = "hair_bonnie_short"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/bonniealtshort
|
||||
name = "Bonnie Alt, Short"
|
||||
icon_state = "hair_bonniealt_short"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/bowl
|
||||
name = "Bowl"
|
||||
icon_state = "hair_bowlcut"
|
||||
@@ -449,10 +407,6 @@
|
||||
name = "Dave"
|
||||
icon_state = "hair_dave"
|
||||
|
||||
/datum/sprite_accessory/hair/dawn
|
||||
name = "Dawn"
|
||||
icon_state = "hair_dawn"
|
||||
|
||||
/datum/sprite_accessory/hair/devillock
|
||||
name = "Devil Lock"
|
||||
icon_state = "hair_devilock"
|
||||
@@ -490,10 +444,6 @@
|
||||
icon_state = "hair_drillruru"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/eagle
|
||||
name = "Eagle"
|
||||
icon_state = "hair_eagle"
|
||||
|
||||
/datum/sprite_accessory/hair/elize
|
||||
name = "Elize"
|
||||
icon_state = "hair_elize"
|
||||
@@ -563,11 +513,6 @@
|
||||
gender = MALE
|
||||
flags = HAIR_VERY_SHORT
|
||||
|
||||
/datum/sprite_accessory/hair/falcon
|
||||
name = "Falcon"
|
||||
icon_state = "hair_falcon"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/familyman
|
||||
name = "Family Man"
|
||||
icon_state = "hair_thefamilyman"
|
||||
@@ -610,15 +555,6 @@
|
||||
name = "Flow Hair"
|
||||
icon_state = "hair_f"
|
||||
|
||||
/datum/sprite_accessory/hair/fluffy
|
||||
name = "Fluffy"
|
||||
icon_state = "hair_fluffy"
|
||||
|
||||
/datum/sprite_accessory/hair/fluffylong
|
||||
name = "Fluffy, Long"
|
||||
icon_state = "hair_fluffy_long"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/longfringe
|
||||
name = "Fringe Long"
|
||||
icon_state = "hair_longfringe"
|
||||
@@ -700,16 +636,6 @@
|
||||
name = "Hitop"
|
||||
icon_state = "hair_hitop"
|
||||
|
||||
/datum/sprite_accessory/hair/hummingbird
|
||||
name = "Hummingbird"
|
||||
icon_state = "hair_hummingbird"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/inari
|
||||
name = "Inari"
|
||||
icon_state = "hair_inari"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/jade
|
||||
name = "Jade"
|
||||
icon_state = "hair_jade"
|
||||
@@ -790,16 +716,6 @@
|
||||
icon_state = "hair_hbraid"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/macaw
|
||||
name = "Macaw"
|
||||
icon_state = "hair_macaw"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/magpie
|
||||
name = "Magpie"
|
||||
icon_state = "hair_magpie"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/manbun
|
||||
name = "Manbun"
|
||||
icon_state = "hair_manbun"
|
||||
@@ -900,21 +816,6 @@
|
||||
name = "Overeye Very Short"
|
||||
icon_state = "hair_veryshortovereye"
|
||||
|
||||
/datum/sprite_accessory/hair/overear
|
||||
name = "Over Ear, Right"
|
||||
icon_state = "hair_overear1"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/overear2
|
||||
name = "Over Ear, Left"
|
||||
icon_state = "hair_overear2"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/owl
|
||||
name = "Owl"
|
||||
icon_state = "hair_owl"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/parted
|
||||
name = "Parted"
|
||||
icon_state = "hair_parted"
|
||||
@@ -978,16 +879,6 @@
|
||||
icon_state = "hair_spikyponytail"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/thinponytail
|
||||
name = "Ponytail Thin"
|
||||
icon_state = "hair_thinponytail"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/thinponytaillong
|
||||
name = "Ponytail Thin, Long"
|
||||
icon_state = "hair_thinponytail_long"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/poofy
|
||||
name = "Poofy"
|
||||
icon_state = "hair_poofy"
|
||||
@@ -998,11 +889,6 @@
|
||||
icon_state = "hair_poofy2"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/princess
|
||||
name = "Princess"
|
||||
icon_state = "hair_princess"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/proper
|
||||
name = "Proper"
|
||||
icon_state = "hair_proper"
|
||||
@@ -1179,16 +1065,6 @@
|
||||
icon_state = "hair_spikey"
|
||||
species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI)
|
||||
|
||||
/datum/sprite_accessory/hair/starling
|
||||
name = "Starling"
|
||||
icon_state = "hair_starling"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/stork
|
||||
name = "Stork"
|
||||
icon_state = "hair_stork"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/straightlong
|
||||
name = "Straight Long"
|
||||
icon_state = "hair_straightlong"
|
||||
@@ -1211,11 +1087,6 @@
|
||||
icon_state = "hair_sweptfringe"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/taro
|
||||
name = "Taro"
|
||||
icon_state = "hair_taro"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/terezi
|
||||
name = "Terezi"
|
||||
icon_state = "hair_terezi"
|
||||
@@ -1264,21 +1135,6 @@
|
||||
icon_state = "hair_twintail"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/twintails
|
||||
name = "Twintails"
|
||||
icon_state = "hair_twintails"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/twintailslong
|
||||
name = "Twintails, Long"
|
||||
icon_state = "hair_twintails_long"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/twintailsshort
|
||||
name = "Twintails, Short"
|
||||
icon_state = "hair_twintails_short"
|
||||
flags = HAIR_TIEABLE
|
||||
|
||||
/datum/sprite_accessory/hair/twinbob
|
||||
name = "Twinbun Bob"
|
||||
icon_state = "hair_bunbob"
|
||||
|
||||
@@ -380,54 +380,6 @@
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/tail/bigsnaketail
|
||||
name = "large snake tail (vwag)"
|
||||
desc = ""
|
||||
icon_state = "bigsnaketail"
|
||||
do_colouration = TRUE
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
ani_state = "bigsnaketail_w"
|
||||
|
||||
/datum/sprite_accessory/tail/bigsnaketailstripes
|
||||
name = "large snake tail, striped (vwag)"
|
||||
desc = ""
|
||||
icon_state = "bigsnaketailstripes"
|
||||
extra_overlay = "bigsnaketailstripes-tips"
|
||||
do_colouration = TRUE
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
ani_state = "bigsnaketailstripes_w"
|
||||
extra_overlay_w = "bigsnaketailstripes-tips_w"
|
||||
|
||||
/datum/sprite_accessory/tail/bigsnaketailstripes_alt
|
||||
name = "large snake tail, striped, alt (vwag)"
|
||||
desc = ""
|
||||
icon_state = "bigsnaketailstripesalt"
|
||||
extra_overlay = "bigsnaketailstripesalt-tips"
|
||||
do_colouration = TRUE
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
ani_state = "bigsnaketailstripesalt_w"
|
||||
extra_overlay_w = "bigsnaketailstripesalt-tips_w"
|
||||
|
||||
/datum/sprite_accessory/tail/bigsnaketaildual
|
||||
name = "large snake tail, dual color (vwag)"
|
||||
desc = ""
|
||||
icon_state = "bigsnaketaildual"
|
||||
extra_overlay = "bigsnaketaildual-tips"
|
||||
do_colouration = TRUE
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
ani_state = "bigsnaketaildual_w"
|
||||
extra_overlay_w = "bigsnaketaildual-tips_w"
|
||||
|
||||
/datum/sprite_accessory/tail/bigsnaketailunder
|
||||
name = "large snake tail, under (vwag)"
|
||||
desc = ""
|
||||
icon_state = "bigsnaketailunder"
|
||||
extra_overlay = "bigsnaketailunder-tips"
|
||||
do_colouration = TRUE
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
ani_state = "bigsnaketailunder_w"
|
||||
extra_overlay_w = "bigsnaketailunder-tips_w"
|
||||
|
||||
/datum/sprite_accessory/tail/vulpan_alt
|
||||
name = "vulpkanin alt style, colorable"
|
||||
desc = ""
|
||||
@@ -1057,4 +1009,4 @@
|
||||
extra_overlay = "zorgoia_fluff"
|
||||
extra_overlay2 = "zorgoia_fluff_top"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
@@ -72,15 +72,11 @@
|
||||
/datum/nifsoft/soulcatcher/proc/notify_into(var/message)
|
||||
var/sound = nif.good_sound
|
||||
|
||||
to_chat(nif.human,
|
||||
type = MESSAGE_TYPE_NIF,
|
||||
html = "<span class='nif'><b>\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\]</b> <b>Soulcatcher</b> displays, \"<span class='notice nif'>[message]</span>\"</span>")
|
||||
to_chat(nif.human,"<span class='nif'><b>\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\]</b> <b>Soulcatcher</b> displays, \"<span class='notice nif'>[message]</span>\"</span>")
|
||||
nif.human << sound
|
||||
|
||||
for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs)
|
||||
to_chat(CS,
|
||||
type = MESSAGE_TYPE_NIF,
|
||||
html = "<span class='nif'><b>\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\]</b> <b>Soulcatcher</b> displays, \"<span class='notice nif'>[message]</span>\"</span>")
|
||||
to_chat(CS,"<span class='nif'><b>\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\]</b> <b>Soulcatcher</b> displays, \"<span class='notice nif'>[message]</span>\"</span>")
|
||||
CS << sound
|
||||
|
||||
/datum/nifsoft/soulcatcher/proc/say_into(var/message, var/mob/living/sender, var/mob/eyeobj)
|
||||
@@ -92,13 +88,9 @@
|
||||
|
||||
//Not AR Projecting
|
||||
else
|
||||
to_chat(nif.human,
|
||||
type = MESSAGE_TYPE_NIF,
|
||||
html = "<span class='nif'><b>\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\]</b> <b>[sender_name]</b> speaks, \"[message]\"</span>")
|
||||
to_chat(nif.human,"<span class='nif'><b>\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\]</b> <b>[sender_name]</b> speaks, \"[message]\"</span>")
|
||||
for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs)
|
||||
to_chat(CS,
|
||||
type = MESSAGE_TYPE_NIF,
|
||||
html = "<span class='nif'><b>\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\]</b> <b>[sender_name]</b> speaks, \"[message]\"</span>")
|
||||
to_chat(CS,"<span class='nif'><b>\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\]</b> <b>[sender_name]</b> speaks, \"[message]\"</span>")
|
||||
|
||||
log_nsay(message,nif.human.real_name,sender)
|
||||
|
||||
@@ -111,13 +103,9 @@
|
||||
|
||||
//Not AR Projecting
|
||||
else
|
||||
to_chat(nif.human,
|
||||
type = MESSAGE_TYPE_NIF,
|
||||
html = "<span class='nif'><b>\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\]</b> <b>[sender_name]</b> [message]</span>")
|
||||
to_chat(nif.human,"<span class='nif'><b>\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\]</b> <b>[sender_name]</b> [message]</span>")
|
||||
for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs)
|
||||
to_chat(CS,
|
||||
type = MESSAGE_TYPE_NIF,
|
||||
html = "<span class='nif'><b>\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\]</b> <b>[sender_name]</b> [message]</span>")
|
||||
to_chat(CS,"<span class='nif'><b>\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\]</b> <b>[sender_name]</b> [message]</span>")
|
||||
|
||||
log_nme(message,nif.human.real_name,sender)
|
||||
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
## /TG/ Chat
|
||||
|
||||
/TG/ Chat, which will be referred to as TgChat from this point onwards, is a system in which we can send messages to clients in a controlled and semi-reliable manner. The standard way of sending messages to BYOND clients simply dumps whatever you output to them directly into their chat window, however BYOND allows us to load our own code on the client to change this behaviour in a way that allows us to do some pretty neat things.
|
||||
|
||||
### Message Format
|
||||
|
||||
TgChat handles sending messages from the server to the client through the use of JSON payloads, of which the format will change depending on the type of message and the intended client endpoint. An example of the payload for chat messages is as follows:
|
||||
```json
|
||||
{
|
||||
"sequence": 0,
|
||||
"content": {
|
||||
"type": ". . .", // ?optional
|
||||
"text": ". . .", // ?optional !atleast-one
|
||||
"html": ". . .", // ?optional !atleast-one
|
||||
"avoidHighlighting": 0 // ?optional
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### Reliability
|
||||
|
||||
In the past there have been issues where BYOND will silently and without reason lose a message we sent to the client, to detect this and recover from it seamlessly TgChat also has a baked in reliability layer. This reliability layer is very primitive, and simply keeps track of received sequence numbers. Should the client receive an unexpected sequence number TgChat asks the server to resend any missing packets.
|
||||
|
||||
### Ping System
|
||||
|
||||
TgChat supports a round trip time ping measurement, which is displayed to the client so they can know how long it takes for their commands and inputs to reach the server. This is done by sending the client a ping request, `ping/soft`, which tells the client to send a ping to the server. When the server receives said ping it sends a reply, `ping/reply`, to the client with a payload containing the current DateTime which the client can reference against the initial ping request.
|
||||
|
||||
### Chat Tabs, Local Storage, and Highlighting
|
||||
|
||||
To make organizing and managing chat easier and more functional for both players and admins, TgChat has the ability to filter out messages based on their primary tag, such as individual departmental radios, to a dedicated chat tab for easier reading and comprehension. These tabs can also be configured to highlist messages based on a simple keyword search. You can set a multitude of different keywords to search for and they will be highlighting for instant alerting of the client. Said tabs, highlighting rules, and your chat history will persist thanks to use of local storage on the client. Using local storage TgChat can ensure that your preferences are saved and maintained between client restarts and switching between other /TG/ servers. Local Storage is also used to keep your chat history aswell, should you need to scroll through your chat logs.
|
||||
@@ -1,48 +0,0 @@
|
||||
/// Old VChat Code Stuff
|
||||
|
||||
/* Old bicon code
|
||||
/proc/expire_bicon_cache(key)
|
||||
if(GLOB.bicon_cache[key])
|
||||
GLOB.bicon_cache -= key
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
GLOBAL_LIST_EMPTY(bicon_cache) // Cache of the <img> tag results, not the icons
|
||||
*/
|
||||
|
||||
/proc/bicon(var/obj, var/use_class = 1, var/custom_classes = "")
|
||||
return icon2base64html(obj, custom_classes)
|
||||
|
||||
/* Old bicon code
|
||||
var/class = use_class ? "class='icon misc [custom_classes]'" : null
|
||||
if(!obj)
|
||||
return
|
||||
|
||||
// Try to avoid passing bicon an /icon directly. It is better to pass it an atom so it can cache.
|
||||
if(isicon(obj)) // Passed an icon directly, nothing to cache-key on, as icon refs get reused *often*
|
||||
return "<img [class] src='data:image/png;base64,[icon2base64(obj)]'>"
|
||||
|
||||
// Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with.
|
||||
var/atom/A = obj
|
||||
var/key
|
||||
var/changes_often = ishuman(A) || isobserver(A) // If this ends up with more, move it into a proc or var on atom.
|
||||
|
||||
if(changes_often)
|
||||
key = "\ref[A]"
|
||||
else
|
||||
key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]"
|
||||
|
||||
var/base64 = GLOB.bicon_cache[key]
|
||||
// Non-human atom, no cache
|
||||
if(!base64) // Doesn't exist, make it.
|
||||
base64 = icon2base64(A.examine_icon(), key)
|
||||
GLOB.bicon_cache[key] = base64
|
||||
if(changes_often)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/expire_bicon_cache, key), 50 SECONDS, TIMER_UNIQUE)
|
||||
|
||||
// May add a class to the img tag created by bicon
|
||||
if(use_class)
|
||||
class = "class='icon [A.icon_state] [custom_classes]'"
|
||||
|
||||
return "<IMG [class] src='data:image/png;base64,[base64]'>"
|
||||
*/
|
||||
@@ -1,17 +0,0 @@
|
||||
/**
|
||||
* Message-related procs
|
||||
*
|
||||
* Message format (/list):
|
||||
* - type - Message type, must be one of defines in `code/__DEFINES/chat.dm`
|
||||
* - text - Plain message text
|
||||
* - html - HTML message text
|
||||
* - Optional metadata, can be any key/value pair.
|
||||
*
|
||||
* Copyright (c) 2020 Aleksej Komarov
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
/proc/message_to_html(message)
|
||||
// Here it is possible to add a switch statement
|
||||
// to custom-handle various message types.
|
||||
return message["html"] || message["text"]
|
||||
@@ -1,85 +0,0 @@
|
||||
/*!
|
||||
* Copyright (c) 2020 Aleksej Komarov
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
/**
|
||||
* Circumvents the message queue and sends the message
|
||||
* to the recipient (target) as soon as possible.
|
||||
*/
|
||||
/proc/to_chat_immediate(
|
||||
target,
|
||||
html,
|
||||
type = null,
|
||||
text = null,
|
||||
avoid_highlighting = FALSE,
|
||||
// FIXME: These flags are now pointless and have no effect
|
||||
handle_whitespace = TRUE,
|
||||
trailing_newline = TRUE,
|
||||
confidential = FALSE
|
||||
)
|
||||
// Useful where the integer 0 is the entire message. Use case is enabling to_chat(target, some_boolean) while preventing to_chat(target, "")
|
||||
html = "[html]"
|
||||
text = "[text]"
|
||||
|
||||
if(!target)
|
||||
return
|
||||
if(!html && !text)
|
||||
CRASH("Empty or null string in to_chat proc call.")
|
||||
if(target == world)
|
||||
target = GLOB.clients
|
||||
|
||||
// Build a message
|
||||
var/message = list()
|
||||
if(type) message["type"] = type
|
||||
if(text) message["text"] = text
|
||||
if(html) message["html"] = html
|
||||
if(avoid_highlighting) message["avoidHighlighting"] = avoid_highlighting
|
||||
|
||||
// send it immediately
|
||||
SSchat.send_immediate(target, message)
|
||||
|
||||
/**
|
||||
* Sends the message to the recipient (target).
|
||||
*
|
||||
* Recommended way to write to_chat calls:
|
||||
* ```
|
||||
* to_chat(client,
|
||||
* type = MESSAGE_TYPE_INFO,
|
||||
* html = "You have found <strong>[object]</strong>")
|
||||
* ```
|
||||
*/
|
||||
/proc/to_chat(
|
||||
target,
|
||||
html,
|
||||
type = null,
|
||||
text = null,
|
||||
avoid_highlighting = FALSE,
|
||||
// FIXME: These flags are now pointless and have no effect
|
||||
handle_whitespace = TRUE,
|
||||
trailing_newline = TRUE,
|
||||
confidential = FALSE
|
||||
)
|
||||
//if(isnull(Master) || !SSchat?.initialized || !MC_RUNNING(SSchat.init_stage))
|
||||
if(isnull(Master) || !SSchat?.subsystem_initialized)
|
||||
to_chat_immediate(target, html, type, text, avoid_highlighting)
|
||||
return
|
||||
|
||||
// Useful where the integer 0 is the entire message. Use case is enabling to_chat(target, some_boolean) while preventing to_chat(target, "")
|
||||
html = "[html]"
|
||||
text = "[text]"
|
||||
|
||||
if(!target)
|
||||
return
|
||||
if(!html && !text)
|
||||
CRASH("Empty or null string in to_chat proc call.")
|
||||
if(target == world)
|
||||
target = GLOB.clients
|
||||
|
||||
// Build a message
|
||||
var/message = list()
|
||||
if(type) message["type"] = type
|
||||
if(text) message["text"] = text
|
||||
if(html) message["html"] = html
|
||||
if(avoid_highlighting) message["avoidHighlighting"] = avoid_highlighting
|
||||
SSchat.queue(target, message)
|
||||
@@ -380,8 +380,6 @@
|
||||
// Resend the assets
|
||||
for(var/asset in sent_assets)
|
||||
send_asset(asset)
|
||||
if("chat/resend")
|
||||
SSchat.handle_resend(client, payload)
|
||||
|
||||
/datum/tgui_window/vv_edit_var(var_name, var_value)
|
||||
return var_name != NAMEOF(src, id) && ..()
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
/*!
|
||||
* Copyright (c) 2020 Aleksej Komarov
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
/// Admin music volume, from 0 to 1.
|
||||
/client/var/admin_music_volume = 1
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Sends music data to the browser.
|
||||
*
|
||||
* Optional settings:
|
||||
* - pitch: the playback rate
|
||||
* - start: the start time of the sound
|
||||
* - end: when the musics stops playing
|
||||
*
|
||||
* required url string Must be an https URL.
|
||||
* optional extra_data list Optional settings.
|
||||
*/
|
||||
/datum/tgui_panel/proc/play_music(url, extra_data)
|
||||
if(!is_ready())
|
||||
return
|
||||
if(!findtext(url, GLOB.is_http_protocol))
|
||||
return
|
||||
var/list/payload = list()
|
||||
if(length(extra_data) > 0)
|
||||
for(var/key in extra_data)
|
||||
payload[key] = extra_data[key]
|
||||
payload["url"] = url
|
||||
window.send_message("audio/playMusic", payload)
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Stops playing music through the browser.
|
||||
*/
|
||||
/datum/tgui_panel/proc/stop_music()
|
||||
if(!is_ready())
|
||||
return
|
||||
window.send_message("audio/stopMusic")
|
||||
@@ -1,45 +0,0 @@
|
||||
/*!
|
||||
* Copyright (c) 2020 Aleksej Komarov
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
/client/var/datum/tgui_panel/tgui_panel
|
||||
|
||||
/**
|
||||
* tgui panel / chat troubleshooting verb
|
||||
*/
|
||||
/client/verb/fix_tgui_panel()
|
||||
set name = "Fix chat"
|
||||
set category = "OOC"
|
||||
var/action
|
||||
log_tgui(src, "Started fixing.", context = "verb/fix_tgui_panel")
|
||||
|
||||
nuke_chat()
|
||||
|
||||
// Failed to fix, using tgalert as fallback
|
||||
action = tgalert(src, "Did that work?", "", "Yes", "No, switch to old ui")
|
||||
if (action == "No, switch to old ui")
|
||||
winset(src, "output", "on-show=&is-disabled=0&is-visible=1")
|
||||
winset(src, "browseroutput", "is-disabled=1;is-visible=0")
|
||||
log_tgui(src, "Failed to fix.", context = "verb/fix_tgui_panel")
|
||||
|
||||
/client/proc/nuke_chat()
|
||||
// Catch all solution (kick the whole thing in the pants)
|
||||
winset(src, "output", "on-show=&is-disabled=0&is-visible=1")
|
||||
winset(src, "browseroutput", "is-disabled=1;is-visible=0")
|
||||
if(!tgui_panel || !istype(tgui_panel))
|
||||
log_tgui(src, "tgui_panel datum is missing",
|
||||
context = "verb/fix_tgui_panel")
|
||||
tgui_panel = new(src)
|
||||
tgui_panel.initialize(force = TRUE)
|
||||
// Force show the panel to see if there are any errors
|
||||
winset(src, "output", "is-disabled=1&is-visible=0")
|
||||
winset(src, "browseroutput", "is-disabled=0;is-visible=1")
|
||||
|
||||
/client/verb/refresh_tgui()
|
||||
set name = "Refresh TGUI"
|
||||
set category = "OOC"
|
||||
|
||||
for(var/window_id in tgui_windows)
|
||||
var/datum/tgui_window/window = tgui_windows[window_id]
|
||||
window.reinitialize()
|
||||
@@ -1,146 +0,0 @@
|
||||
/*!
|
||||
* Copyright (c) 2020 Aleksej Komarov
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
/**
|
||||
* Maximum number of connection records allowed to analyze.
|
||||
* Should match the value set in the browser.
|
||||
*/
|
||||
#define TGUI_TELEMETRY_MAX_CONNECTIONS 5
|
||||
|
||||
/**
|
||||
* Maximum time allocated for sending a telemetry packet.
|
||||
*/
|
||||
#define TGUI_TELEMETRY_RESPONSE_WINDOW (30 SECONDS)
|
||||
|
||||
/// Time of telemetry request
|
||||
/datum/tgui_panel/var/telemetry_requested_at
|
||||
/// Time of telemetry analysis completion
|
||||
/datum/tgui_panel/var/telemetry_analyzed_at
|
||||
/// List of previous client connections
|
||||
/datum/tgui_panel/var/list/telemetry_connections
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Requests some telemetry from the client.
|
||||
*/
|
||||
/datum/tgui_panel/proc/request_telemetry()
|
||||
telemetry_requested_at = world.time
|
||||
telemetry_analyzed_at = null
|
||||
window.send_message("telemetry/request", list(
|
||||
"limits" = list(
|
||||
"connections" = TGUI_TELEMETRY_MAX_CONNECTIONS,
|
||||
),
|
||||
))
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Analyzes a telemetry packet.
|
||||
*
|
||||
* Is currently only useful for detecting ban evasion attempts.
|
||||
*/
|
||||
/datum/tgui_panel/proc/analyze_telemetry(payload)
|
||||
if(world.time > telemetry_requested_at + TGUI_TELEMETRY_RESPONSE_WINDOW)
|
||||
message_admins("[key_name(client)] sent telemetry outside of the allocated time window.")
|
||||
return
|
||||
if(telemetry_analyzed_at)
|
||||
message_admins("[key_name(client)] sent telemetry more than once.")
|
||||
return
|
||||
telemetry_analyzed_at = world.time
|
||||
if(!payload)
|
||||
return
|
||||
telemetry_connections = payload["connections"]
|
||||
var/len = length(telemetry_connections)
|
||||
if(len == 0)
|
||||
return
|
||||
if(len > TGUI_TELEMETRY_MAX_CONNECTIONS)
|
||||
message_admins("[key_name(client)] was kicked for sending a huge telemetry payload")
|
||||
qdel(client)
|
||||
return
|
||||
|
||||
var/ckey = client?.ckey
|
||||
if (!ckey)
|
||||
return
|
||||
|
||||
/* FIXME: Stuff we dont have > Can be reimplemented later on
|
||||
var/list/all_known_alts = GLOB.known_alts.load_known_alts()
|
||||
var/list/our_known_alts = list()
|
||||
|
||||
for (var/known_alt in all_known_alts)
|
||||
if (known_alt[1] == ckey)
|
||||
our_known_alts += known_alt[2]
|
||||
else if (known_alt[2] == ckey)
|
||||
our_known_alts += known_alt[1]
|
||||
|
||||
var/list/found
|
||||
|
||||
var/list/query_data = list()
|
||||
|
||||
for(var/i in 1 to len)
|
||||
if(QDELETED(client))
|
||||
// He got cleaned up before we were done
|
||||
return
|
||||
var/list/row = telemetry_connections[i]
|
||||
|
||||
// Check for a malformed history object
|
||||
if (!row || row.len < 3 || (!row["ckey"] || !row["address"] || !row["computer_id"]))
|
||||
return
|
||||
|
||||
if (!isnull(GLOB.round_id))
|
||||
query_data += list(list(
|
||||
"telemetry_ckey" = row["ckey"],
|
||||
"address" = row["address"],
|
||||
"computer_id" = row["computer_id"],
|
||||
))
|
||||
|
||||
if (row["ckey"] in our_known_alts)
|
||||
continue
|
||||
|
||||
if (world.IsBanned(row["ckey"], row["address"], row["computer_id"], real_bans_only = TRUE))
|
||||
found = row
|
||||
break
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
// This fucker has a history of playing on a banned account.
|
||||
if(found)
|
||||
var/msg = "[key_name(client)] has a banned account in connection history! (Matched: [found["ckey"]], [found["address"]], [found["computer_id"]])"
|
||||
message_admins(msg)
|
||||
send2tgs_adminless_only("Banned-user", msg)
|
||||
log_admin_private(msg)
|
||||
log_suspicious_login(msg, access_log_mirror = FALSE)
|
||||
|
||||
// Only log them all at the end, since it's not as important as reporting an evader
|
||||
for (var/list/one_query as anything in query_data)
|
||||
var/datum/db_query/query = SSdbcore.NewQuery({"
|
||||
INSERT INTO [format_table_name("telemetry_connections")] (
|
||||
ckey,
|
||||
telemetry_ckey,
|
||||
address,
|
||||
computer_id,
|
||||
first_round_id,
|
||||
latest_round_id
|
||||
) VALUES(
|
||||
:ckey,
|
||||
:telemetry_ckey,
|
||||
INET_ATON(:address),
|
||||
:computer_id,
|
||||
:round_id,
|
||||
:round_id
|
||||
) ON DUPLICATE KEY UPDATE latest_round_id = :round_id
|
||||
"}, list(
|
||||
"ckey" = ckey,
|
||||
"telemetry_ckey" = one_query["telemetry_ckey"],
|
||||
"address" = one_query["address"],
|
||||
"computer_id" = one_query["computer_id"],
|
||||
"round_id" = GLOB.round_id,
|
||||
))
|
||||
query.Execute()
|
||||
qdel(query)
|
||||
*/
|
||||
|
||||
#undef TGUI_TELEMETRY_MAX_CONNECTIONS
|
||||
#undef TGUI_TELEMETRY_RESPONSE_WINDOW
|
||||
@@ -1,102 +0,0 @@
|
||||
/*!
|
||||
* Copyright (c) 2020 Aleksej Komarov
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
/**
|
||||
* tgui_panel datum
|
||||
* Hosts tgchat and other nice features.
|
||||
*/
|
||||
/datum/tgui_panel
|
||||
var/client/client
|
||||
var/datum/tgui_window/window
|
||||
var/broken = FALSE
|
||||
var/initialized_at
|
||||
var/oldchat = FALSE
|
||||
|
||||
/datum/tgui_panel/New(client/client, id)
|
||||
src.client = client
|
||||
window = new(client, id)
|
||||
window.subscribe(src, PROC_REF(on_message))
|
||||
|
||||
/datum/tgui_panel/Del()
|
||||
window.unsubscribe(src)
|
||||
window.close()
|
||||
return ..()
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* TRUE if panel is initialized and ready to receive messages.
|
||||
*/
|
||||
/datum/tgui_panel/proc/is_ready()
|
||||
return !broken && window.is_ready()
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Initializes tgui panel.
|
||||
*/
|
||||
/datum/tgui_panel/proc/initialize(force = FALSE)
|
||||
set waitfor = FALSE
|
||||
// Minimal sleep to defer initialization to after client constructor
|
||||
sleep(1 TICKS)
|
||||
initialized_at = world.time
|
||||
// Perform a clean initialization
|
||||
window.initialize(
|
||||
strict_mode = TRUE,
|
||||
assets = list(
|
||||
get_asset_datum(/datum/asset/simple/tgui_panel),
|
||||
))
|
||||
window.send_asset(get_asset_datum(/datum/asset/simple/fontawesome))
|
||||
window.send_asset(get_asset_datum(/datum/asset/simple/tgfont))
|
||||
window.send_asset(get_asset_datum(/datum/asset/spritesheet/chat))
|
||||
// Other setup
|
||||
request_telemetry()
|
||||
addtimer(CALLBACK(src, PROC_REF(on_initialize_timed_out)), 5 SECONDS)
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Called when initialization has timed out.
|
||||
*/
|
||||
/datum/tgui_panel/proc/on_initialize_timed_out()
|
||||
// Currently does nothing but sending a message to old chat.
|
||||
// SEND_TEXT(client, "<span class=\"userdanger\">Failed to load fancy chat, click <a href='?src=[REF(src)];reload_tguipanel=1'>HERE</a> to attempt to reload it.</span>")
|
||||
|
||||
/**
|
||||
* private
|
||||
*
|
||||
* Callback for handling incoming tgui messages.
|
||||
*/
|
||||
/datum/tgui_panel/proc/on_message(type, payload)
|
||||
if(type == "ready")
|
||||
broken = FALSE
|
||||
window.send_message("update", list(
|
||||
"config" = list(
|
||||
"client" = list(
|
||||
"ckey" = client.ckey,
|
||||
"address" = client.address,
|
||||
"computer_id" = client.computer_id,
|
||||
),
|
||||
"window" = list(
|
||||
"fancy" = FALSE,
|
||||
"locked" = FALSE,
|
||||
),
|
||||
),
|
||||
))
|
||||
return TRUE
|
||||
if(type == "audio/setAdminMusicVolume")
|
||||
client.admin_music_volume = payload["volume"]
|
||||
return TRUE
|
||||
if(type == "telemetry")
|
||||
analyze_telemetry(payload)
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* public
|
||||
*
|
||||
* Sends a round restart notification.
|
||||
*/
|
||||
/datum/tgui_panel/proc/send_roundrestart()
|
||||
window.send_message("roundrestart")
|
||||
@@ -129,7 +129,6 @@ body.inverted {
|
||||
.emote {color: #000000;}
|
||||
.inverted .emote {color: #FFFFFF;}
|
||||
.alert {color: #ff0000;}
|
||||
.valert {color: #ff0000;}
|
||||
h1.alert, h2.alert {color: #000000;}
|
||||
/* VOREStation Add Start */
|
||||
.nif {}
|
||||
@@ -148,16 +147,12 @@ h1.alert, h2.alert {color: #000000;}
|
||||
|
||||
.critical {color: #ff0000; font-weight: bold; font-size: 150%;}
|
||||
.danger {color: #ff0000; font-weight: bold;}
|
||||
.vdanger {color: #ff0000; font-weight: bold;}
|
||||
.warning {color: #ff0000; font-style: italic;}
|
||||
.vwarning {color: #ff0000; font-style: italic;}
|
||||
.rose {color: #ff5050;}
|
||||
.info {color: #0000CC;}
|
||||
.inverted .info {color: #6060c9;} /* Dark mode */
|
||||
.notice {color: #000099;}
|
||||
.inverted .notice {color: #6060c9;} /* Dark mode */
|
||||
.vnotice {color: #000099;}
|
||||
.inverted .vnotice {color: #6060c9;} /* Dark mode */
|
||||
.alium {color: #00ff00;}
|
||||
.cult {color: #800080; font-weight: bold; font-style: italic;}
|
||||
|
||||
|
||||
@@ -176,14 +176,6 @@ function start_vue() {
|
||||
required: false,
|
||||
admin: false
|
||||
},
|
||||
{
|
||||
matches: ".valert, .vwarning, .vnotice, .vdanger",
|
||||
becomes: "vc_vore_message",
|
||||
pretty: "Vore Messages",
|
||||
tooltip: "Vore Messages",
|
||||
required: false,
|
||||
admin: false
|
||||
},
|
||||
{
|
||||
matches: ".filter_deadsay, .deadsay",
|
||||
becomes: "vc_deadchat",
|
||||
|
||||
@@ -114,81 +114,6 @@
|
||||
"Your fruitless mental struggles only shift %pred's %belly a tiny bit.",
|
||||
"You can't make any progress freeing yourself from %pred's %belly.")
|
||||
|
||||
var/list/escape_attempt_messages_owner = list(
|
||||
"%prey is attempting to free themselves from your %belly!")
|
||||
|
||||
var/list/escape_attempt_messages_prey = list(
|
||||
"You start to climb out of %pred's %belly.")
|
||||
|
||||
var/list/escape_messages_owner = list(
|
||||
"%prey climbs out of your %belly!")
|
||||
|
||||
var/list/escape_messages_prey = list(
|
||||
"You climb out of %pred's %belly.")
|
||||
|
||||
var/list/escape_messages_outside = list(
|
||||
"%prey climbs out of %pred's %belly!")
|
||||
|
||||
var/list/escape_item_messages_owner = list(
|
||||
"%item suddenly slips out of your %belly!")
|
||||
|
||||
var/list/escape_item_messages_prey = list(
|
||||
"Your struggles successfully cause %pred to squeeze your %item out of their %belly.")
|
||||
|
||||
var/list/escape_item_messages_outside = list(
|
||||
"%item suddenly slips out of %pred's %belly!")
|
||||
|
||||
var/list/escape_fail_messages_owner = list(
|
||||
"%prey's attempt to escape from your %belly has failed!")
|
||||
|
||||
var/list/escape_fail_messages_prey = list(
|
||||
"Your attempt to escape %pred's %belly has failed!")
|
||||
|
||||
var/list/escape_attempt_absorbed_messages_owner = list(
|
||||
"%prey is attempting to free themselves from your %belly!")
|
||||
|
||||
var/list/escape_attempt_absorbed_messages_prey = list(
|
||||
"You try to force yourself out of %pred's %belly.")
|
||||
|
||||
var/list/escape_absorbed_messages_owner = list(
|
||||
"%prey forces themselves free of your %belly!")
|
||||
|
||||
var/list/escape_absorbed_messages_prey = list(
|
||||
"You manage to free yourself from %pred's %belly.")
|
||||
|
||||
var/list/escape_absorbed_messages_outside = list(
|
||||
"%prey climbs out of %pred's %belly!")
|
||||
|
||||
var/list/escape_fail_absorbed_messages_owner = list(
|
||||
"%prey's attempt to escape form your %belly has failed!")
|
||||
|
||||
var/list/escape_fail_absorbed_messages_prey = list(
|
||||
"Before you manage to reach freedom, you feel yourself getting dragged back into %pred's %belly!")
|
||||
|
||||
var/list/primary_transfer_messages_owner = list(
|
||||
"%prey slid into your %dest due to their struggling inside your %belly!")
|
||||
|
||||
var/list/primary_transfer_messages_prey = list(
|
||||
"Your attempt to escape %pred's %belly has failed and your struggles only results in you sliding into pred's %dest!")
|
||||
|
||||
var/list/secondary_transfer_messages_owner = list(
|
||||
"%prey slid into your %dest due to their struggling inside your %belly!")
|
||||
|
||||
var/list/secondary_transfer_messages_prey = list(
|
||||
"Your attempt to escape %pred's %belly has failed and your struggles only results in you sliding into pred's %dest!")
|
||||
|
||||
var/list/digest_chance_messages_owner = list(
|
||||
"You feel your %belly beginning to become active!")
|
||||
|
||||
var/list/digest_chance_messages_prey = list(
|
||||
"In response to your struggling, %owner's %belly begins to get more active...")
|
||||
|
||||
var/list/absorb_chance_messages_owner = list(
|
||||
"You feel your %belly start to cling onto its contents...")
|
||||
|
||||
var/list/absorb_chance_messages_prey = list(
|
||||
"In response to your struggling, %owner's %belly begins to cling more tightly...")
|
||||
|
||||
var/list/digest_messages_owner = list(
|
||||
"You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.",
|
||||
"You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.",
|
||||
@@ -271,7 +196,6 @@
|
||||
"digestchance",
|
||||
"absorbchance",
|
||||
"escapechance",
|
||||
"escapechance_absorbed",
|
||||
"transferchance",
|
||||
"transferchance_secondary",
|
||||
"transferlocation",
|
||||
@@ -283,31 +207,6 @@
|
||||
"struggle_messages_inside",
|
||||
"absorbed_struggle_messages_outside",
|
||||
"absorbed_struggle_messages_inside",
|
||||
"escape_attempt_messages_owner",
|
||||
"escape_attempt_messages_prey",
|
||||
"escape_messages_owner",
|
||||
"escape_messages_prey",
|
||||
"escape_messages_outside",
|
||||
"escape_item_messages_owner",
|
||||
"escape_item_messages_prey",
|
||||
"escape_item_messages_outside",
|
||||
"escape_fail_messages_owner",
|
||||
"escape_fail_messages_prey",
|
||||
"escape_attempt_absorbed_messages_owner",
|
||||
"escape_attempt_absorbed_messages_prey",
|
||||
"escape_absorbed_messages_owner",
|
||||
"escape_absorbed_messages_prey",
|
||||
"escape_absorbed_messages_outside",
|
||||
"escape_fail_absorbed_messages_owner",
|
||||
"escape_fail_absorbed_messages_prey",
|
||||
"primary_transfer_messages_owner",
|
||||
"primary_transfer_messages_prey",
|
||||
"secondary_transfer_messages_owner",
|
||||
"secondary_transfer_messages_prey",
|
||||
"digest_chance_messages_owner",
|
||||
"digest_chance_messages_prey",
|
||||
"absorb_chance_messages_owner",
|
||||
"absorb_chance_messages_prey",
|
||||
"digest_messages_owner",
|
||||
"digest_messages_prey",
|
||||
"absorb_messages_owner",
|
||||
@@ -370,7 +269,7 @@
|
||||
return //Someone dropping something (or being stripdigested)
|
||||
|
||||
//Generic entered message
|
||||
to_chat(owner,"<span class='vnotice'>[thing] slides into your [lowertext(name)].</span>")
|
||||
to_chat(owner,"<span class='notice'>[thing] slides into your [lowertext(name)].</span>")
|
||||
|
||||
//Sound w/ antispam flag setting
|
||||
if(vore_sound && !recent_sound)
|
||||
@@ -400,11 +299,11 @@
|
||||
formatted_desc = replacetext(raw_desc, "%belly", lowertext(name)) //replace with this belly's name
|
||||
formatted_desc = replacetext(formatted_desc, "%pred", owner) //replace with this belly's owner
|
||||
formatted_desc = replacetext(formatted_desc, "%prey", M) //replace with whatever mob entered into this belly
|
||||
to_chat(M, "<span class='vnotice'><B>[formatted_desc]</B></span>")
|
||||
to_chat(M, "<span class='notice'><B>[formatted_desc]</B></span>")
|
||||
|
||||
var/taste
|
||||
if(can_taste && (taste = M.get_taste_message(FALSE)))
|
||||
to_chat(owner, "<span class='vnotice'>[M] tastes of [taste].</span>")
|
||||
to_chat(owner, "<span class='notice'>[M] tastes of [taste].</span>")
|
||||
vore_fx(M)
|
||||
//Stop AI processing in bellies
|
||||
if(M.ai_holder)
|
||||
@@ -471,7 +370,7 @@
|
||||
|
||||
if(disable_hud)
|
||||
if(L?.hud_used?.hud_shown)
|
||||
to_chat(L, "<span class='vnotice'>((Your pred has disabled huds in their belly. Turn off vore FX and hit F12 to get it back; or relax, and enjoy the serenity.))</span>")
|
||||
to_chat(L, "<span class='notice'>((Your pred has disabled huds in their belly. Turn off vore FX and hit F12 to get it back; or relax, and enjoy the serenity.))</span>")
|
||||
L.toggle_hud_vis(TRUE)
|
||||
|
||||
/obj/belly/proc/vore_preview(mob/living/L)
|
||||
@@ -703,7 +602,7 @@
|
||||
formatted_message = replacetext(formatted_message, "%countprey", living_count)
|
||||
formatted_message = replacetext(formatted_message, "%count", contents.len)
|
||||
|
||||
return("<span class='vwarning'>[formatted_message]</span>")
|
||||
return("<span class='warning'>[formatted_message]</span>")
|
||||
|
||||
/obj/belly/proc/get_examine_msg_absorbed()
|
||||
if(!(contents.len) || !(examine_messages_absorbed.len) || !display_absorbed_examine)
|
||||
@@ -727,13 +626,13 @@
|
||||
formatted_message = replacetext(formatted_message, "%prey", english_list(absorbed_victims))
|
||||
formatted_message = replacetext(formatted_message, "%countprey", absorbed_count)
|
||||
|
||||
return("<span class='vwarning'>[formatted_message]</span>")
|
||||
return("<span class='warning'>[formatted_message]</span>")
|
||||
|
||||
// The next function gets the messages set on the belly, in human-readable format.
|
||||
// This is useful in customization boxes and such. The delimiter right now is \n\n so
|
||||
// in message boxes, this looks nice and is easily delimited.
|
||||
/obj/belly/proc/get_messages(type, delim = "\n\n")
|
||||
ASSERT(type == "smo" || type == "smi" || type == "asmo" || type == "asmi" || type == "escao" || type == "escap" || type == "escp" || type == "esco" || type == "escout" || type == "escip" || type == "escio" || type == "esciout" || type == "escfp" || type == "escfo" || type == "aescao" || type == "aescap" || type == "aescp" || type == "aesco" || type == "aescout" || type == "aescfp" || type == "aescfo" || type == "trnspp" || type == "trnspo" || type == "trnssp" || type == "trnsso" || type == "stmodp" || type == "stmodo" || type == "stmoap" || type == "stmoao" || type == "dmo" || type == "dmp" || type == "amo" || type == "amp" || type == "uamo" || type == "uamp" || type == "em" || type == "ema" || type == "im_digest" || type == "im_hold" || type == "im_holdabsorbed" || type == "im_absorb" || type == "im_heal" || type == "im_drain" || type == "im_steal" || type == "im_egg" || type == "im_shrink" || type == "im_grow" || type == "im_unabsorb")
|
||||
ASSERT(type == "smo" || type == "smi" || type == "asmo" || type == "asmi" || type == "dmo" || type == "dmp" || type == "amo" || type == "amp" || type == "uamo" || type == "uamp" || type == "em" || type == "ema" || type == "im_digest" || type == "im_hold" || type == "im_holdabsorbed" || type == "im_absorb" || type == "im_heal" || type == "im_drain" || type == "im_steal" || type == "im_egg" || type == "im_shrink" || type == "im_grow" || type == "im_unabsorb")
|
||||
|
||||
var/list/raw_messages
|
||||
switch(type)
|
||||
@@ -745,56 +644,6 @@
|
||||
raw_messages = absorbed_struggle_messages_outside
|
||||
if("asmi")
|
||||
raw_messages = absorbed_struggle_messages_inside
|
||||
if("escao")
|
||||
raw_messages = escape_attempt_messages_owner
|
||||
if("escap")
|
||||
raw_messages = escape_attempt_messages_prey
|
||||
if("esco")
|
||||
raw_messages = escape_messages_owner
|
||||
if("escp")
|
||||
raw_messages = escape_messages_prey
|
||||
if("escout")
|
||||
raw_messages = escape_messages_outside
|
||||
if("escio")
|
||||
raw_messages = escape_item_messages_owner
|
||||
if("escip")
|
||||
raw_messages = escape_item_messages_prey
|
||||
if("esciout")
|
||||
raw_messages = escape_item_messages_outside
|
||||
if("escfo")
|
||||
raw_messages = escape_fail_messages_owner
|
||||
if("escfp")
|
||||
raw_messages = escape_fail_messages_prey
|
||||
if("aescao")
|
||||
raw_messages = escape_attempt_absorbed_messages_owner
|
||||
if("aescap")
|
||||
raw_messages = escape_attempt_absorbed_messages_prey
|
||||
if("aesco")
|
||||
raw_messages = escape_absorbed_messages_owner
|
||||
if("aescp")
|
||||
raw_messages = escape_absorbed_messages_prey
|
||||
if("aescout")
|
||||
raw_messages = escape_absorbed_messages_outside
|
||||
if("aescfo")
|
||||
raw_messages = escape_fail_absorbed_messages_owner
|
||||
if("aescfp")
|
||||
raw_messages = escape_fail_absorbed_messages_prey
|
||||
if("trnspo")
|
||||
raw_messages = primary_transfer_messages_owner
|
||||
if("trnspp")
|
||||
raw_messages = primary_transfer_messages_prey
|
||||
if("trnsso")
|
||||
raw_messages = secondary_transfer_messages_owner
|
||||
if("trnssp")
|
||||
raw_messages = secondary_transfer_messages_prey
|
||||
if("stmodo")
|
||||
raw_messages = digest_chance_messages_owner
|
||||
if("stmodp")
|
||||
raw_messages = digest_chance_messages_prey
|
||||
if("stmoao")
|
||||
raw_messages = absorb_chance_messages_owner
|
||||
if("stmoap")
|
||||
raw_messages = absorb_chance_messages_prey
|
||||
if("dmo")
|
||||
raw_messages = digest_messages_owner
|
||||
if("dmp")
|
||||
@@ -842,7 +691,7 @@
|
||||
// replacement strings and linebreaks as delimiters (two \n\n by default).
|
||||
// They also sanitize the messages.
|
||||
/obj/belly/proc/set_messages(raw_text, type, delim = "\n\n")
|
||||
ASSERT(type == "smo" || type == "smi" || type == "asmo" || type == "asmi" || type == "escao" || type == "escap" || type == "escp" || type == "esco" || type == "escout" || type == "escip" || type == "escio" || type == "esciout" || type == "escfp" || type == "escfo" || type == "aescao" || type == "aescap" || type == "aescp" || type == "aesco" || type == "aescout" || type == "aescfp" || type == "aescfo" || type == "trnspp" || type == "trnspo" || type == "trnssp" || type == "trnsso" || type == "stmodp" || type == "stmodo" || type == "stmoap" || type == "stmoao" || type == "dmo" || type == "dmp" || type == "amo" || type == "amp" || type == "uamo" || type == "uamp" || type == "em" || type == "ema" || type == "im_digest" || type == "im_hold" || type == "im_holdabsorbed" || type == "im_absorb" || type == "im_heal" || type == "im_drain" || type == "im_steal" || type == "im_egg" || type == "im_shrink" || type == "im_grow" || type == "im_unabsorb")
|
||||
ASSERT(type == "smo" || type == "smi" || type == "asmo" || type == "asmi" || type == "dmo" || type == "dmp" || type == "amo" || type == "amp" || type == "uamo" || type == "uamp" || type == "em" || type == "ema" || type == "im_digest" || type == "im_hold" || type == "im_holdabsorbed" || type == "im_absorb" || type == "im_heal" || type == "im_drain" || type == "im_steal" || type == "im_egg" || type == "im_shrink" || type == "im_grow" || type == "im_unabsorb")
|
||||
|
||||
var/list/raw_list = splittext(html_encode(raw_text),delim)
|
||||
if(raw_list.len > 10)
|
||||
@@ -875,56 +724,6 @@
|
||||
absorbed_struggle_messages_outside = raw_list
|
||||
if("asmi")
|
||||
absorbed_struggle_messages_inside = raw_list
|
||||
if("escao")
|
||||
escape_attempt_messages_owner = raw_list
|
||||
if("escap")
|
||||
escape_attempt_messages_prey = raw_list
|
||||
if("esco")
|
||||
escape_messages_owner = raw_list
|
||||
if("escp")
|
||||
escape_messages_prey = raw_list
|
||||
if("escout")
|
||||
escape_messages_outside = raw_list
|
||||
if("escio")
|
||||
escape_item_messages_owner = raw_list
|
||||
if("escip")
|
||||
escape_item_messages_prey = raw_list
|
||||
if("esciout")
|
||||
escape_item_messages_outside = raw_list
|
||||
if("escfo")
|
||||
escape_fail_messages_owner = raw_list
|
||||
if("escfp")
|
||||
escape_fail_messages_prey = raw_list
|
||||
if("aescao")
|
||||
escape_attempt_absorbed_messages_owner = raw_list
|
||||
if("aescap")
|
||||
escape_attempt_absorbed_messages_prey = raw_list
|
||||
if("aesco")
|
||||
escape_absorbed_messages_owner = raw_list
|
||||
if("aescp")
|
||||
escape_absorbed_messages_prey = raw_list
|
||||
if("aescout")
|
||||
escape_absorbed_messages_outside = raw_list
|
||||
if("aescfo")
|
||||
escape_fail_absorbed_messages_owner = raw_list
|
||||
if("aescfp")
|
||||
escape_fail_absorbed_messages_prey = raw_list
|
||||
if("trnspo")
|
||||
primary_transfer_messages_owner = raw_list
|
||||
if("trnspp")
|
||||
primary_transfer_messages_prey = raw_list
|
||||
if("trnsso")
|
||||
secondary_transfer_messages_owner = raw_list
|
||||
if("trnssp")
|
||||
secondary_transfer_messages_prey = raw_list
|
||||
if("stmodo")
|
||||
digest_chance_messages_owner = raw_list
|
||||
if("stmodp")
|
||||
digest_chance_messages_prey = raw_list
|
||||
if("stmoao")
|
||||
absorb_chance_messages_owner = raw_list
|
||||
if("stmoap")
|
||||
absorb_chance_messages_prey = raw_list
|
||||
if("dmo")
|
||||
digest_messages_owner = raw_list
|
||||
if("dmp")
|
||||
@@ -1041,8 +840,8 @@
|
||||
|
||||
GLOB.prey_absorbed_roundstat++
|
||||
|
||||
to_chat(M, "<span class='vnotice'>[absorb_alert_prey]</span>")
|
||||
to_chat(owner, "<span class='vnotice'>[absorb_alert_owner]</span>")
|
||||
to_chat(M, "<span class='notice'>[absorb_alert_prey]</span>")
|
||||
to_chat(owner, "<span class='notice'>[absorb_alert_owner]</span>")
|
||||
if(M.noisy) //Mute drained absorbee hunger if enabled.
|
||||
M.noisy = FALSE
|
||||
|
||||
@@ -1081,7 +880,7 @@
|
||||
formatted_abs_desc = replacetext(absorbed_desc, "%belly", lowertext(name)) //replace with this belly's name
|
||||
formatted_abs_desc = replacetext(formatted_abs_desc, "%pred", owner) //replace with this belly's owner
|
||||
formatted_abs_desc = replacetext(formatted_abs_desc, "%prey", M) //replace with whatever mob entered into this belly
|
||||
to_chat(M, "<span class='vnotice'><B>[formatted_abs_desc]</B></span>")
|
||||
to_chat(M, "<span class='notice'><B>[formatted_abs_desc]</B></span>")
|
||||
|
||||
//Update owner
|
||||
owner.updateVRPanel()
|
||||
@@ -1111,11 +910,11 @@
|
||||
|
||||
M.absorbed = FALSE
|
||||
handle_absorb_langs(M, owner)
|
||||
to_chat(M, "<span class='vnotice'>[unabsorb_alert_prey]</span>")
|
||||
to_chat(owner, "<span class='vnotice'>[unabsorb_alert_owner]</span>")
|
||||
to_chat(M, "<span class='notice'>[unabsorb_alert_prey]</span>")
|
||||
to_chat(owner, "<span class='notice'>[unabsorb_alert_owner]</span>")
|
||||
|
||||
if(desc)
|
||||
to_chat(M, "<span class='vnotice'><B>[desc]</B></span>")
|
||||
to_chat(M, "<span class='notice'><B>[desc]</B></span>")
|
||||
|
||||
//Update owner
|
||||
owner.updateVRPanel()
|
||||
@@ -1171,48 +970,9 @@
|
||||
|
||||
R.setClickCooldown(50)
|
||||
|
||||
var/living_count = 0
|
||||
for(var/mob/living/L in contents)
|
||||
living_count++
|
||||
|
||||
var/escape_attempt_owner_message = pick(escape_attempt_messages_owner)
|
||||
var/escape_attempt_prey_message = pick(escape_attempt_messages_prey)
|
||||
var/escape_fail_owner_message = pick(escape_fail_messages_owner)
|
||||
var/escape_fail_prey_message = pick(escape_fail_messages_prey)
|
||||
|
||||
escape_attempt_owner_message = replacetext(escape_attempt_owner_message, "%pred", owner)
|
||||
escape_attempt_owner_message = replacetext(escape_attempt_owner_message, "%prey", R)
|
||||
escape_attempt_owner_message = replacetext(escape_attempt_owner_message, "%belly", lowertext(name))
|
||||
escape_attempt_owner_message = replacetext(escape_attempt_owner_message, "%countprey", living_count)
|
||||
escape_attempt_owner_message = replacetext(escape_attempt_owner_message, "%count", contents.len)
|
||||
|
||||
escape_attempt_prey_message = replacetext(escape_attempt_prey_message, "%pred", owner)
|
||||
escape_attempt_prey_message = replacetext(escape_attempt_prey_message, "%prey", R)
|
||||
escape_attempt_prey_message = replacetext(escape_attempt_prey_message, "%belly", lowertext(name))
|
||||
escape_attempt_prey_message = replacetext(escape_attempt_prey_message, "%countprey", living_count)
|
||||
escape_attempt_prey_message = replacetext(escape_attempt_prey_message, "%count", contents.len)
|
||||
|
||||
escape_fail_owner_message = replacetext(escape_fail_owner_message, "%pred", owner)
|
||||
escape_fail_owner_message = replacetext(escape_fail_owner_message, "%prey", R)
|
||||
escape_fail_owner_message = replacetext(escape_fail_owner_message, "%belly", lowertext(name))
|
||||
escape_fail_owner_message = replacetext(escape_fail_owner_message, "%countprey", living_count)
|
||||
escape_fail_owner_message = replacetext(escape_fail_owner_message, "%count", contents.len)
|
||||
|
||||
escape_fail_prey_message = replacetext(escape_fail_prey_message, "%pred", owner)
|
||||
escape_fail_prey_message = replacetext(escape_fail_prey_message, "%prey", R)
|
||||
escape_fail_prey_message = replacetext(escape_fail_prey_message, "%belly", lowertext(name))
|
||||
escape_fail_prey_message = replacetext(escape_fail_prey_message, "%countprey", living_count)
|
||||
escape_fail_prey_message = replacetext(escape_fail_prey_message, "%count", contents.len)
|
||||
|
||||
escape_attempt_owner_message = "<span class='vwarning'>[escape_attempt_owner_message]</span>"
|
||||
escape_attempt_prey_message = "<span class='vwarning'>[escape_attempt_prey_message]</span>"
|
||||
escape_fail_owner_message = "<span class='vwarning'>[escape_fail_owner_message]</span>"
|
||||
escape_fail_prey_message = "<span class='vnotice'>[escape_fail_prey_message]</span>"
|
||||
|
||||
if(owner.stat) //If owner is stat (dead, KO) we can actually escape
|
||||
escape_attempt_prey_message = replacetext(escape_attempt_prey_message, new/regex("^(<span(?: \[^>]*)?>.*)(</span>)$", ""), "$1 (This will take around [escapetime/10] seconds.)$2")
|
||||
to_chat(R, escape_attempt_prey_message)
|
||||
to_chat(owner, escape_attempt_owner_message)
|
||||
to_chat(R, "<span class='warning'>You attempt to climb out of \the [lowertext(name)]. (This will take around [escapetime/10] seconds.)</span>")
|
||||
to_chat(owner, "<span class='warning'>Someone is attempting to climb out of your [lowertext(name)]!</span>")
|
||||
|
||||
if(do_after(R, escapetime, owner, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED))
|
||||
if((owner.stat || escapable)) //Can still escape?
|
||||
@@ -1225,13 +985,17 @@
|
||||
else if(R.loc != src) //Aren't even in the belly. Quietly fail.
|
||||
return
|
||||
else //Belly became inescapable or mob revived
|
||||
to_chat(R, escape_fail_prey_message)
|
||||
to_chat(owner, escape_fail_owner_message)
|
||||
to_chat(R,"<span class='warning'>Your attempt to escape [lowertext(name)] has failed!</span>")
|
||||
to_chat(owner,"<span class='notice'>The attempt to escape from your [lowertext(name)] has failed!</span>")
|
||||
return
|
||||
return
|
||||
var/struggle_outer_message = pick(struggle_messages_outside)
|
||||
var/struggle_user_message = pick(struggle_messages_inside)
|
||||
|
||||
var/living_count = 0
|
||||
for(var/mob/living/L in contents)
|
||||
living_count++
|
||||
|
||||
struggle_outer_message = replacetext(struggle_outer_message, "%pred", owner)
|
||||
struggle_outer_message = replacetext(struggle_outer_message, "%prey", R)
|
||||
struggle_outer_message = replacetext(struggle_outer_message, "%belly", lowertext(name))
|
||||
@@ -1244,8 +1008,8 @@
|
||||
struggle_user_message = replacetext(struggle_user_message, "%countprey", living_count)
|
||||
struggle_user_message = replacetext(struggle_user_message, "%count", contents.len)
|
||||
|
||||
struggle_outer_message = "<span class='valert'>[struggle_outer_message]</span>"
|
||||
struggle_user_message = "<span class='valert'>[struggle_user_message]</span>"
|
||||
struggle_outer_message = "<span class='alert'>[struggle_outer_message]</span>"
|
||||
struggle_user_message = "<span class='alert'>[struggle_user_message]</span>"
|
||||
|
||||
for(var/mob/M in hearers(4, owner))
|
||||
M.show_message(struggle_outer_message, 2) // hearable
|
||||
@@ -1264,82 +1028,28 @@
|
||||
|
||||
if(escapable) //If the stomach has escapable enabled.
|
||||
if(prob(escapechance)) //Let's have it check to see if the prey escapes first.
|
||||
to_chat(R, escape_attempt_prey_message)
|
||||
to_chat(owner, escape_attempt_owner_message)
|
||||
to_chat(R, "<span class='warning'>You start to climb out of \the [lowertext(name)].</span>")
|
||||
to_chat(owner, "<span class='warning'>Someone is attempting to climb out of your [lowertext(name)]!</span>")
|
||||
if(do_after(R, escapetime))
|
||||
if(escapable && C)
|
||||
var/escape_item_owner_message = pick(escape_item_messages_owner)
|
||||
var/escape_item_prey_message = pick(escape_item_messages_prey)
|
||||
var/escape_item_outside_message = pick(escape_item_messages_outside)
|
||||
|
||||
escape_item_owner_message = replacetext(escape_item_owner_message, "%pred", owner)
|
||||
escape_item_owner_message = replacetext(escape_item_owner_message, "%prey", R)
|
||||
escape_item_owner_message = replacetext(escape_item_owner_message, "%belly", lowertext(name))
|
||||
escape_item_owner_message = replacetext(escape_item_owner_message, "%countprey", living_count)
|
||||
escape_item_owner_message = replacetext(escape_item_owner_message, "%count", contents.len)
|
||||
escape_item_owner_message = replacetext(escape_item_owner_message, "%item", C)
|
||||
|
||||
escape_item_prey_message = replacetext(escape_item_prey_message, "%pred", owner)
|
||||
escape_item_prey_message = replacetext(escape_item_prey_message, "%prey", R)
|
||||
escape_item_prey_message = replacetext(escape_item_prey_message, "%belly", lowertext(name))
|
||||
escape_item_prey_message = replacetext(escape_item_prey_message, "%countprey", living_count)
|
||||
escape_item_prey_message = replacetext(escape_item_prey_message, "%count", contents.len)
|
||||
escape_item_prey_message = replacetext(escape_item_prey_message, "%item", C)
|
||||
|
||||
escape_item_outside_message = replacetext(escape_item_outside_message, "%pred", owner)
|
||||
escape_item_outside_message = replacetext(escape_item_outside_message, "%prey", R)
|
||||
escape_item_outside_message = replacetext(escape_item_outside_message, "%belly", lowertext(name))
|
||||
escape_item_outside_message = replacetext(escape_item_outside_message, "%countprey", living_count)
|
||||
escape_item_outside_message = replacetext(escape_item_outside_message, "%count", contents.len)
|
||||
escape_item_outside_message = replacetext(escape_item_outside_message, "%item", C)
|
||||
|
||||
escape_item_owner_message = "<span class='vwarning'>[escape_item_owner_message]</span>"
|
||||
escape_item_prey_message = "<span class='vwarning'>[escape_item_prey_message]</span>"
|
||||
escape_item_outside_message = "<span class='vwarning'>[escape_item_outside_message]</span>"
|
||||
|
||||
release_specific_contents(C)
|
||||
to_chat(R, escape_item_prey_message)
|
||||
to_chat(owner, escape_item_owner_message)
|
||||
to_chat(R,"<span class='warning'>Your struggles successfully cause [owner] to squeeze your container out of their \the [lowertext(name)].</span>")
|
||||
to_chat(owner,"<span class='warning'>[C] suddenly slips out of your [lowertext(name)]!</span>")
|
||||
for(var/mob/M in hearers(4, owner))
|
||||
M.show_message(escape_item_outside_message, 2)
|
||||
M.show_message("<span class='warning'>[C] suddenly slips out of [owner]'s [lowertext(name)]!</span>", 2)
|
||||
return
|
||||
if(escapable && (R.loc == src) && !R.absorbed) //Does the owner still have escapable enabled?
|
||||
var/escape_owner_message = pick(escape_messages_owner)
|
||||
var/escape_prey_message = pick(escape_messages_prey)
|
||||
var/escape_outside_message = pick(escape_messages_outside)
|
||||
|
||||
escape_owner_message = replacetext(escape_owner_message, "%pred", owner)
|
||||
escape_owner_message = replacetext(escape_owner_message, "%prey", R)
|
||||
escape_owner_message = replacetext(escape_owner_message, "%belly", lowertext(name))
|
||||
escape_owner_message = replacetext(escape_owner_message, "%countprey", living_count)
|
||||
escape_owner_message = replacetext(escape_owner_message, "%count", contents.len)
|
||||
|
||||
escape_prey_message = replacetext(escape_prey_message, "%pred", owner)
|
||||
escape_prey_message = replacetext(escape_prey_message, "%prey", R)
|
||||
escape_prey_message = replacetext(escape_prey_message, "%belly", lowertext(name))
|
||||
escape_prey_message = replacetext(escape_prey_message, "%countprey", living_count)
|
||||
escape_prey_message = replacetext(escape_prey_message, "%count", contents.len)
|
||||
|
||||
escape_outside_message = replacetext(escape_outside_message, "%pred", owner)
|
||||
escape_outside_message = replacetext(escape_outside_message, "%prey", R)
|
||||
escape_outside_message = replacetext(escape_outside_message, "%belly", lowertext(name))
|
||||
escape_outside_message = replacetext(escape_outside_message, "%countprey", living_count)
|
||||
escape_outside_message = replacetext(escape_outside_message, "%count", contents.len)
|
||||
|
||||
escape_owner_message = "<span class='vwarning'>[escape_owner_message]</span>"
|
||||
escape_prey_message = "<span class='vwarning'>[escape_prey_message]</span>"
|
||||
escape_outside_message = "<span class='vwarning'>[escape_outside_message]</span>"
|
||||
release_specific_contents(R)
|
||||
to_chat(R, escape_prey_message)
|
||||
to_chat(owner, escape_owner_message)
|
||||
to_chat(R,"<span class='warning'>You climb out of \the [lowertext(name)].</span>")
|
||||
to_chat(owner,"<span class='warning'>[R] climbs out of your [lowertext(name)]!</span>")
|
||||
for(var/mob/M in hearers(4, owner))
|
||||
M.show_message(escape_outside_message, 2)
|
||||
M.show_message("<span class='warning'>[R] climbs out of [owner]'s [lowertext(name)]!</span>", 2)
|
||||
return
|
||||
else if(!(R.loc == src)) //Aren't even in the belly. Quietly fail.
|
||||
return
|
||||
else //Belly became inescapable.
|
||||
to_chat(R, escape_fail_prey_message)
|
||||
to_chat(owner, escape_fail_owner_message)
|
||||
to_chat(R,"<span class='warning'>Your attempt to escape [lowertext(name)] has failed!</span>")
|
||||
to_chat(owner,"<span class='notice'>The attempt to escape from your [lowertext(name)] has failed!</span>")
|
||||
return
|
||||
|
||||
else if(prob(transferchance) && transferlocation) //Next, let's have it see if they end up getting into an even bigger mess then when they started.
|
||||
@@ -1350,32 +1060,13 @@
|
||||
break
|
||||
|
||||
if(!dest_belly)
|
||||
to_chat(owner, "<span class='vwarning'>Something went wrong with your belly transfer settings. Your <b>[lowertext(name)]</b> has had it's transfer chance and transfer location cleared as a precaution.</span>")
|
||||
to_chat(owner, "<span class='warning'>Something went wrong with your belly transfer settings. Your <b>[lowertext(name)]</b> has had it's transfer chance and transfer location cleared as a precaution.</span>")
|
||||
transferchance = 0
|
||||
transferlocation = null
|
||||
return
|
||||
var/primary_transfer_owner_message = pick(primary_transfer_messages_owner)
|
||||
var/primary_transfer_prey_message = pick(primary_transfer_messages_prey)
|
||||
|
||||
primary_transfer_owner_message = replacetext(primary_transfer_owner_message, "%pred", owner)
|
||||
primary_transfer_owner_message = replacetext(primary_transfer_owner_message, "%prey", R)
|
||||
primary_transfer_owner_message = replacetext(primary_transfer_owner_message, "%belly", lowertext(name))
|
||||
primary_transfer_owner_message = replacetext(primary_transfer_owner_message, "%countprey", living_count)
|
||||
primary_transfer_owner_message = replacetext(primary_transfer_owner_message, "%count", contents.len)
|
||||
primary_transfer_owner_message = replacetext(primary_transfer_owner_message, "%dest", transferlocation)
|
||||
|
||||
primary_transfer_prey_message = replacetext(primary_transfer_prey_message, "%pred", owner)
|
||||
primary_transfer_prey_message = replacetext(primary_transfer_prey_message, "%prey", R)
|
||||
primary_transfer_prey_message = replacetext(primary_transfer_prey_message, "%belly", lowertext(name))
|
||||
primary_transfer_prey_message = replacetext(primary_transfer_prey_message, "%countprey", living_count)
|
||||
primary_transfer_prey_message = replacetext(primary_transfer_prey_message, "%count", contents.len)
|
||||
primary_transfer_prey_message = replacetext(primary_transfer_prey_message, "%dest", transferlocation)
|
||||
|
||||
primary_transfer_owner_message = "<span class='vwarning'>[primary_transfer_owner_message]</span>"
|
||||
primary_transfer_prey_message = "<span class='vwarning'>[primary_transfer_prey_message]</span>"
|
||||
|
||||
to_chat(R, primary_transfer_prey_message)
|
||||
to_chat(owner, primary_transfer_owner_message)
|
||||
to_chat(R, "<span class='warning'>Your attempt to escape [lowertext(name)] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!</span>")
|
||||
to_chat(owner, "<span class='warning'>Someone slid into your [transferlocation] due to their struggling inside your [lowertext(name)]!</span>")
|
||||
if(C)
|
||||
transfer_contents(C, dest_belly)
|
||||
return
|
||||
@@ -1390,33 +1081,13 @@
|
||||
break
|
||||
|
||||
if(!dest_belly)
|
||||
to_chat(owner, "<span class='vwarning'>Something went wrong with your belly transfer settings. Your <b>[lowertext(name)]</b> has had it's transfer chance and transfer location cleared as a precaution.</span>")
|
||||
to_chat(owner, "<span class='warning'>Something went wrong with your belly transfer settings. Your <b>[lowertext(name)]</b> has had it's transfer chance and transfer location cleared as a precaution.</span>")
|
||||
transferchance_secondary = 0
|
||||
transferlocation_secondary = null
|
||||
return
|
||||
|
||||
var/secondary_transfer_owner_message = pick(secondary_transfer_messages_owner)
|
||||
var/secondary_transfer_prey_message = pick(secondary_transfer_messages_prey)
|
||||
|
||||
secondary_transfer_owner_message = replacetext(secondary_transfer_owner_message, "%pred", owner)
|
||||
secondary_transfer_owner_message = replacetext(secondary_transfer_owner_message, "%prey", R)
|
||||
secondary_transfer_owner_message = replacetext(secondary_transfer_owner_message, "%belly", lowertext(name))
|
||||
secondary_transfer_owner_message = replacetext(secondary_transfer_owner_message, "%countprey", living_count)
|
||||
secondary_transfer_owner_message = replacetext(secondary_transfer_owner_message, "%count", contents.len)
|
||||
secondary_transfer_owner_message = replacetext(secondary_transfer_owner_message, "%dest", transferlocation_secondary)
|
||||
|
||||
secondary_transfer_prey_message = replacetext(secondary_transfer_prey_message, "%pred", owner)
|
||||
secondary_transfer_prey_message = replacetext(secondary_transfer_prey_message, "%prey", R)
|
||||
secondary_transfer_prey_message = replacetext(secondary_transfer_prey_message, "%belly", lowertext(name))
|
||||
secondary_transfer_prey_message = replacetext(secondary_transfer_prey_message, "%countprey", living_count)
|
||||
secondary_transfer_prey_message = replacetext(secondary_transfer_prey_message, "%count", contents.len)
|
||||
secondary_transfer_prey_message = replacetext(secondary_transfer_prey_message, "%dest", transferlocation_secondary)
|
||||
|
||||
secondary_transfer_owner_message = "<span class='vwarning'>[secondary_transfer_owner_message]</span>"
|
||||
secondary_transfer_prey_message = "<span class='vwarning'>[secondary_transfer_prey_message]</span>"
|
||||
|
||||
to_chat(R, secondary_transfer_prey_message)
|
||||
to_chat(owner, secondary_transfer_owner_message)
|
||||
to_chat(R, "<span class='warning'>Your attempt to escape [lowertext(name)] has failed and your struggles only results in you sliding into [owner]'s [transferlocation_secondary]!</span>")
|
||||
to_chat(owner, "<span class='warning'>Someone slid into your [transferlocation_secondary] due to their struggling inside your [lowertext(name)]!</span>")
|
||||
if(C)
|
||||
transfer_contents(C, dest_belly)
|
||||
return
|
||||
@@ -1424,56 +1095,20 @@
|
||||
return
|
||||
|
||||
else if(prob(absorbchance) && digest_mode != DM_ABSORB) //After that, let's have it run the absorb chance.
|
||||
var/absorb_chance_owner_message = pick(absorb_chance_messages_owner)
|
||||
var/absorb_chance_prey_message = pick(absorb_chance_messages_prey)
|
||||
|
||||
absorb_chance_owner_message = replacetext(absorb_chance_owner_message, "%pred", owner)
|
||||
absorb_chance_owner_message = replacetext(absorb_chance_owner_message, "%prey", R)
|
||||
absorb_chance_owner_message = replacetext(absorb_chance_owner_message, "%belly", lowertext(name))
|
||||
absorb_chance_owner_message = replacetext(absorb_chance_owner_message, "%countprey", living_count)
|
||||
absorb_chance_owner_message = replacetext(absorb_chance_owner_message, "%count", contents.len)
|
||||
|
||||
absorb_chance_prey_message = replacetext(absorb_chance_prey_message, "%pred", owner)
|
||||
absorb_chance_prey_message = replacetext(absorb_chance_prey_message, "%prey", R)
|
||||
absorb_chance_prey_message = replacetext(absorb_chance_prey_message, "%belly", lowertext(name))
|
||||
absorb_chance_prey_message = replacetext(absorb_chance_prey_message, "%countprey", living_count)
|
||||
absorb_chance_prey_message = replacetext(absorb_chance_prey_message, "%count", contents.len)
|
||||
|
||||
absorb_chance_owner_message = "<span class='vwarning'>[absorb_chance_owner_message]</span>"
|
||||
absorb_chance_prey_message = "<span class='vwarning'>[absorb_chance_prey_message]</span>"
|
||||
|
||||
to_chat(R, absorb_chance_prey_message)
|
||||
to_chat(owner, absorb_chance_owner_message)
|
||||
to_chat(R, "<span class='warning'>In response to your struggling, \the [lowertext(name)] begins to cling more tightly...</span>")
|
||||
to_chat(owner, "<span class='warning'>You feel your [lowertext(name)] start to cling onto its contents...</span>")
|
||||
digest_mode = DM_ABSORB
|
||||
return
|
||||
|
||||
else if(prob(digestchance) && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance.
|
||||
var/digest_chance_owner_message = pick(digest_chance_messages_owner)
|
||||
var/digest_chance_prey_message = pick(digest_chance_messages_prey)
|
||||
|
||||
digest_chance_owner_message = replacetext(digest_chance_owner_message, "%pred", owner)
|
||||
digest_chance_owner_message = replacetext(digest_chance_owner_message, "%prey", R)
|
||||
digest_chance_owner_message = replacetext(digest_chance_owner_message, "%belly", lowertext(name))
|
||||
digest_chance_owner_message = replacetext(digest_chance_owner_message, "%countprey", living_count)
|
||||
digest_chance_owner_message = replacetext(digest_chance_owner_message, "%count", contents.len)
|
||||
|
||||
digest_chance_prey_message = replacetext(digest_chance_prey_message, "%pred", owner)
|
||||
digest_chance_prey_message = replacetext(digest_chance_prey_message, "%prey", R)
|
||||
digest_chance_prey_message = replacetext(digest_chance_prey_message, "%belly", lowertext(name))
|
||||
digest_chance_prey_message = replacetext(digest_chance_prey_message, "%countprey", living_count)
|
||||
digest_chance_prey_message = replacetext(digest_chance_prey_message, "%count", contents.len)
|
||||
|
||||
digest_chance_owner_message = "<span class='vwarning'>[digest_chance_owner_message]</span>"
|
||||
digest_chance_prey_message = "<span class='vwarning'>[digest_chance_prey_message]</span>"
|
||||
|
||||
to_chat(R, digest_chance_prey_message)
|
||||
to_chat(owner, digest_chance_owner_message)
|
||||
to_chat(R, "<span class='warning'>In response to your struggling, \the [lowertext(name)] begins to get more active...</span>")
|
||||
to_chat(owner, "<span class='warning'>You feel your [lowertext(name)] beginning to become active!</span>")
|
||||
digest_mode = DM_DIGEST
|
||||
return
|
||||
|
||||
else //Nothing interesting happened.
|
||||
to_chat(R, struggle_user_message)
|
||||
to_chat(owner, "<span class='vwarning'>Your prey appears to be unable to make any progress in escaping your [lowertext(name)].</span>")
|
||||
to_chat(owner, "<span class='warning'>Your prey appears to be unable to make any progress in escaping your [lowertext(name)].</span>")
|
||||
return
|
||||
to_chat(R, struggle_user_message)
|
||||
|
||||
@@ -1501,8 +1136,8 @@
|
||||
struggle_user_message = replacetext(struggle_user_message, "%belly", lowertext(name))
|
||||
struggle_user_message = replacetext(struggle_user_message, "%countprey", absorbed_count)
|
||||
|
||||
struggle_outer_message = "<span class='valert'>[struggle_outer_message]</span>"
|
||||
struggle_user_message = "<span class='valert'>[struggle_user_message]</span>"
|
||||
struggle_outer_message = "<span class='alert'>[struggle_outer_message]</span>"
|
||||
struggle_user_message = "<span class='alert'>[struggle_user_message]</span>"
|
||||
|
||||
for(var/mob/M in hearers(4, owner))
|
||||
M.show_message(struggle_outer_message, 2) // hearable
|
||||
@@ -1522,90 +1157,21 @@
|
||||
//absorb resists
|
||||
if(escapable || owner.stat) //If the stomach has escapable enabled or the owner is dead/unconscious
|
||||
if(prob(escapechance) || owner.stat) //Let's have it check to see if the prey's escape attempt starts.
|
||||
|
||||
|
||||
var/living_count = 0
|
||||
for(var/mob/living/L in contents)
|
||||
living_count++
|
||||
|
||||
var/escape_attempt_absorbed_owner_message = pick(escape_attempt_absorbed_messages_owner)
|
||||
var/escape_attempt_absorbed_prey_message = pick(escape_attempt_absorbed_messages_prey)
|
||||
|
||||
escape_attempt_absorbed_owner_message = replacetext(escape_attempt_absorbed_owner_message, "%pred", owner)
|
||||
escape_attempt_absorbed_owner_message = replacetext(escape_attempt_absorbed_owner_message, "%prey", R)
|
||||
escape_attempt_absorbed_owner_message = replacetext(escape_attempt_absorbed_owner_message, "%belly", lowertext(name))
|
||||
escape_attempt_absorbed_owner_message = replacetext(escape_attempt_absorbed_owner_message, "%countprey", living_count)
|
||||
escape_attempt_absorbed_owner_message = replacetext(escape_attempt_absorbed_owner_message, "%count", contents.len)
|
||||
|
||||
escape_attempt_absorbed_prey_message = replacetext(escape_attempt_absorbed_prey_message, "%pred", owner)
|
||||
escape_attempt_absorbed_prey_message = replacetext(escape_attempt_absorbed_prey_message, "%prey", R)
|
||||
escape_attempt_absorbed_prey_message = replacetext(escape_attempt_absorbed_prey_message, "%belly", lowertext(name))
|
||||
escape_attempt_absorbed_prey_message = replacetext(escape_attempt_absorbed_prey_message, "%countprey", living_count)
|
||||
escape_attempt_absorbed_prey_message = replacetext(escape_attempt_absorbed_prey_message, "%count", contents.len)
|
||||
|
||||
escape_attempt_absorbed_owner_message = "<span class='vwarning'>[escape_attempt_absorbed_owner_message]</span>"
|
||||
escape_attempt_absorbed_prey_message = "<span class='vwarning'>[escape_attempt_absorbed_prey_message]</span>"
|
||||
|
||||
to_chat(R, escape_attempt_absorbed_prey_message)
|
||||
to_chat(owner, escape_attempt_absorbed_owner_message)
|
||||
to_chat(R, "<span class='warning'>You try to force yourself out of \the [lowertext(name)].</span>")
|
||||
to_chat(owner, "<span class='warning'>Someone is attempting to free themselves from your [lowertext(name)]!</span>")
|
||||
if(do_after(R, escapetime))
|
||||
if((escapable || owner.stat) && (R.loc == src) && prob(escapechance_absorbed)) //Does the escape attempt succeed?
|
||||
var/escape_absorbed_owner_message = pick(escape_absorbed_messages_owner)
|
||||
var/escape_absorbed_prey_message = pick(escape_absorbed_messages_prey)
|
||||
var/escape_absorbed_outside_message = pick(escape_absorbed_messages_outside)
|
||||
|
||||
escape_absorbed_owner_message = replacetext(escape_absorbed_owner_message, "%pred", owner)
|
||||
escape_absorbed_owner_message = replacetext(escape_absorbed_owner_message, "%prey", R)
|
||||
escape_absorbed_owner_message = replacetext(escape_absorbed_owner_message, "%belly", lowertext(name))
|
||||
escape_absorbed_owner_message = replacetext(escape_absorbed_owner_message, "%countprey", living_count)
|
||||
escape_absorbed_owner_message = replacetext(escape_absorbed_owner_message, "%count", contents.len)
|
||||
|
||||
escape_absorbed_prey_message = replacetext(escape_absorbed_prey_message, "%pred", owner)
|
||||
escape_absorbed_prey_message = replacetext(escape_absorbed_prey_message, "%prey", R)
|
||||
escape_absorbed_prey_message = replacetext(escape_absorbed_prey_message, "%belly", lowertext(name))
|
||||
escape_absorbed_prey_message = replacetext(escape_absorbed_prey_message, "%countprey", living_count)
|
||||
escape_absorbed_prey_message = replacetext(escape_absorbed_prey_message, "%count", contents.len)
|
||||
|
||||
escape_absorbed_outside_message = replacetext(escape_absorbed_outside_message, "%pred", owner)
|
||||
escape_absorbed_outside_message = replacetext(escape_absorbed_outside_message, "%prey", R)
|
||||
escape_absorbed_outside_message = replacetext(escape_absorbed_outside_message, "%belly", lowertext(name))
|
||||
escape_absorbed_outside_message = replacetext(escape_absorbed_outside_message, "%countprey", living_count)
|
||||
escape_absorbed_outside_message = replacetext(escape_absorbed_outside_message, "%count", contents.len)
|
||||
|
||||
escape_absorbed_owner_message = "<span class='vwarning'>[escape_absorbed_owner_message]</span>"
|
||||
escape_absorbed_prey_message = "<span class='vwarning'>[escape_absorbed_prey_message]</span>"
|
||||
escape_absorbed_outside_message = "<span class='vwarning'>[escape_absorbed_outside_message]</span>"
|
||||
|
||||
release_specific_contents(R)
|
||||
to_chat(R, escape_absorbed_prey_message)
|
||||
to_chat(owner, escape_absorbed_owner_message)
|
||||
to_chat(R,"<span class='warning'>You manage to free yourself from \the [lowertext(name)].</span>")
|
||||
to_chat(owner,"<span class='warning'>[R] forces themselves free of your [lowertext(name)]!</span>")
|
||||
for(var/mob/M in hearers(4, owner))
|
||||
M.show_message(escape_absorbed_outside_message, 2)
|
||||
M.show_message("<span class='warning'>[R] climbs out of [owner]'s [lowertext(name)]!</span>", 2)
|
||||
return
|
||||
else if(!(R.loc == src)) //Aren't even in the belly. Quietly fail.
|
||||
return
|
||||
else //Belly became inescapable or you failed your roll.
|
||||
|
||||
var/escape_fail_absorbed_owner_message = pick(escape_fail_absorbed_messages_owner)
|
||||
var/escape_fail_absorbed_prey_message = pick(escape_fail_absorbed_messages_prey)
|
||||
|
||||
escape_fail_absorbed_owner_message = replacetext(escape_fail_absorbed_owner_message, "%pred", owner)
|
||||
escape_fail_absorbed_owner_message = replacetext(escape_fail_absorbed_owner_message, "%prey", R)
|
||||
escape_fail_absorbed_owner_message = replacetext(escape_fail_absorbed_owner_message, "%belly", lowertext(name))
|
||||
escape_fail_absorbed_owner_message = replacetext(escape_fail_absorbed_owner_message, "%countprey", living_count)
|
||||
escape_fail_absorbed_owner_message = replacetext(escape_fail_absorbed_owner_message, "%count", contents.len)
|
||||
|
||||
escape_fail_absorbed_prey_message = replacetext(escape_fail_absorbed_prey_message, "%pred", owner)
|
||||
escape_fail_absorbed_prey_message = replacetext(escape_fail_absorbed_prey_message, "%prey", R)
|
||||
escape_fail_absorbed_prey_message = replacetext(escape_fail_absorbed_prey_message, "%belly", lowertext(name))
|
||||
escape_fail_absorbed_prey_message = replacetext(escape_fail_absorbed_prey_message, "%countprey", living_count)
|
||||
escape_fail_absorbed_prey_message = replacetext(escape_fail_absorbed_prey_message, "%count", contents.len)
|
||||
|
||||
escape_fail_absorbed_owner_message = "<span class='vwarning'>[escape_fail_absorbed_owner_message]</span>"
|
||||
escape_fail_absorbed_prey_message = "<span class='vnotice'>[escape_fail_absorbed_prey_message]</span>"
|
||||
|
||||
to_chat(R, escape_fail_absorbed_prey_message)
|
||||
to_chat(owner, escape_fail_absorbed_owner_message)
|
||||
to_chat(R,"<span class='warning'>Before you manage to reach freedom, you feel yourself getting dragged back into \the [lowertext(name)]!</span>")
|
||||
to_chat(owner,"<span class='notice'>The attempt to escape from your [lowertext(name)] has failed!</span>")
|
||||
return
|
||||
to_chat(R, struggle_user_message)
|
||||
|
||||
@@ -1689,7 +1255,6 @@
|
||||
dupe.digestchance = digestchance
|
||||
dupe.absorbchance = absorbchance
|
||||
dupe.escapechance = escapechance
|
||||
dupe.escapechance_absorbed = escapechance_absorbed
|
||||
dupe.transferchance = transferchance
|
||||
dupe.transferchance_secondary = transferchance_secondary
|
||||
dupe.transferlocation = transferlocation
|
||||
@@ -1743,131 +1308,6 @@
|
||||
for(var/I in absorbed_struggle_messages_inside)
|
||||
dupe.absorbed_struggle_messages_inside += I
|
||||
|
||||
//escape_attempt_messages_owner - strings
|
||||
dupe.escape_attempt_messages_owner.Cut()
|
||||
for(var/I in escape_attempt_messages_owner)
|
||||
dupe.escape_attempt_messages_owner += I
|
||||
|
||||
//escape_attempt_messages_prey - strings
|
||||
dupe.escape_attempt_messages_prey.Cut()
|
||||
for(var/I in escape_attempt_messages_prey)
|
||||
dupe.escape_attempt_messages_prey += I
|
||||
|
||||
//escape_messages_owner - strings
|
||||
dupe.escape_messages_owner.Cut()
|
||||
for(var/I in escape_messages_owner)
|
||||
dupe.escape_messages_owner += I
|
||||
|
||||
//escape_messages_prey - strings
|
||||
dupe.escape_messages_prey.Cut()
|
||||
for(var/I in escape_messages_prey)
|
||||
dupe.escape_messages_prey += I
|
||||
|
||||
//escape_messages_outside - strings
|
||||
dupe.escape_messages_outside.Cut()
|
||||
for(var/I in escape_messages_outside)
|
||||
dupe.escape_messages_outside += I
|
||||
|
||||
//escape_item_messages_owner - strings
|
||||
dupe.escape_item_messages_owner.Cut()
|
||||
for(var/I in escape_item_messages_owner)
|
||||
dupe.escape_item_messages_owner += I
|
||||
|
||||
//escape_item_messages_prey - strings
|
||||
dupe.escape_item_messages_prey.Cut()
|
||||
for(var/I in escape_item_messages_prey)
|
||||
dupe.escape_item_messages_prey += I
|
||||
|
||||
//escape_item_messages_outside - strings
|
||||
dupe.escape_item_messages_outside.Cut()
|
||||
for(var/I in escape_item_messages_outside)
|
||||
dupe.escape_item_messages_outside += I
|
||||
|
||||
//escape_fail_messages_owner - strings
|
||||
dupe.escape_fail_messages_owner.Cut()
|
||||
for(var/I in escape_fail_messages_owner)
|
||||
dupe.escape_fail_messages_owner += I
|
||||
|
||||
//escape_fail_messages_prey - strings
|
||||
dupe.escape_fail_messages_prey.Cut()
|
||||
for(var/I in escape_fail_messages_prey)
|
||||
dupe.escape_fail_messages_prey += I
|
||||
|
||||
//escape_attempt_absorbed_messages_owner - strings
|
||||
dupe.escape_attempt_absorbed_messages_owner.Cut()
|
||||
for(var/I in escape_attempt_absorbed_messages_owner)
|
||||
dupe.escape_attempt_absorbed_messages_owner += I
|
||||
|
||||
//escape_attempt_absorbed_messages_prey - strings
|
||||
dupe.escape_attempt_absorbed_messages_prey.Cut()
|
||||
for(var/I in escape_attempt_absorbed_messages_prey)
|
||||
dupe.escape_attempt_absorbed_messages_prey += I
|
||||
|
||||
//escape_absorbed_messages_owner - strings
|
||||
dupe.escape_absorbed_messages_owner.Cut()
|
||||
for(var/I in escape_absorbed_messages_owner)
|
||||
dupe.escape_absorbed_messages_owner += I
|
||||
|
||||
//escape_absorbed_messages_prey - strings
|
||||
dupe.escape_absorbed_messages_prey.Cut()
|
||||
for(var/I in escape_absorbed_messages_prey)
|
||||
dupe.escape_absorbed_messages_prey += I
|
||||
|
||||
//escape_absorbed_messages_outside - strings
|
||||
dupe.escape_absorbed_messages_outside.Cut()
|
||||
for(var/I in escape_absorbed_messages_outside)
|
||||
dupe.escape_absorbed_messages_outside += I
|
||||
|
||||
//escape_fail_absorbed_messages_owner - strings
|
||||
dupe.escape_fail_absorbed_messages_owner.Cut()
|
||||
for(var/I in escape_fail_absorbed_messages_owner)
|
||||
dupe.escape_fail_absorbed_messages_owner += I
|
||||
|
||||
//escape_fail_absorbed_messages_prey - strings
|
||||
dupe.escape_fail_absorbed_messages_prey.Cut()
|
||||
for(var/I in escape_fail_absorbed_messages_prey)
|
||||
dupe.escape_fail_absorbed_messages_prey += I
|
||||
|
||||
//primary_transfer_messages_owner - strings
|
||||
dupe.primary_transfer_messages_owner.Cut()
|
||||
for(var/I in primary_transfer_messages_owner)
|
||||
dupe.primary_transfer_messages_owner += I
|
||||
|
||||
//primary_transfer_messages_prey - strings
|
||||
dupe.primary_transfer_messages_prey.Cut()
|
||||
for(var/I in primary_transfer_messages_prey)
|
||||
dupe.primary_transfer_messages_prey += I
|
||||
|
||||
//secondary_transfer_messages_owner - strings
|
||||
dupe.secondary_transfer_messages_owner.Cut()
|
||||
for(var/I in secondary_transfer_messages_owner)
|
||||
dupe.secondary_transfer_messages_owner += I
|
||||
|
||||
//secondary_transfer_messages_prey - strings
|
||||
dupe.secondary_transfer_messages_prey.Cut()
|
||||
for(var/I in secondary_transfer_messages_prey)
|
||||
dupe.secondary_transfer_messages_prey += I
|
||||
|
||||
//digest_chance_messages_owner - strings
|
||||
dupe.digest_chance_messages_owner.Cut()
|
||||
for(var/I in digest_chance_messages_owner)
|
||||
dupe.digest_chance_messages_owner += I
|
||||
|
||||
//digest_chance_messages_prey - strings
|
||||
dupe.digest_chance_messages_prey.Cut()
|
||||
for(var/I in digest_chance_messages_prey)
|
||||
dupe.digest_chance_messages_prey += I
|
||||
|
||||
//absorb_chance_messages_owner - strings
|
||||
dupe.absorb_chance_messages_owner.Cut()
|
||||
for(var/I in absorb_chance_messages_owner)
|
||||
dupe.absorb_chance_messages_owner += I
|
||||
|
||||
//absorb_chance_messages_prey - strings
|
||||
dupe.absorb_chance_messages_prey.Cut()
|
||||
for(var/I in absorb_chance_messages_prey)
|
||||
dupe.absorb_chance_messages_prey += I
|
||||
|
||||
//digest_messages_owner - strings
|
||||
dupe.digest_messages_owner.Cut()
|
||||
for(var/I in digest_messages_owner)
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
formatted_message = replacetext(formatted_message, "%prey", M)
|
||||
formatted_message = replacetext(formatted_message, "%countprey", absorbed_count)
|
||||
if(formatted_message)
|
||||
to_chat(M, "<span class='vnotice'>[formatted_message]</span>")
|
||||
to_chat(M, "<span class='notice'>[formatted_message]</span>")
|
||||
else
|
||||
if (digest_mode == DM_SELECT)
|
||||
var/datum/digest_mode/selective/DM_S = GLOB.digest_modes[DM_SELECT]
|
||||
@@ -141,7 +141,7 @@
|
||||
formatted_message = replacetext(formatted_message, "%countprey", living_count)
|
||||
formatted_message = replacetext(formatted_message, "%count", contents.len)
|
||||
if(formatted_message)
|
||||
to_chat(M, "<span class='vnotice'>[formatted_message]</span>")
|
||||
to_chat(M, "<span class='notice'>[formatted_message]</span>")
|
||||
|
||||
if(to_update)
|
||||
updateVRPanels()
|
||||
@@ -280,8 +280,8 @@
|
||||
digest_alert_prey = replacetext(digest_alert_prey, "%count", contents.len)
|
||||
|
||||
//Send messages
|
||||
to_chat(owner, "<span class='vnotice'>[digest_alert_owner]</span>")
|
||||
to_chat(M, "<span class='vnotice'>[digest_alert_prey]</span>")
|
||||
to_chat(owner, "<span class='notice'>[digest_alert_owner]</span>")
|
||||
to_chat(M, "<span class='notice'>[digest_alert_prey]</span>")
|
||||
|
||||
if(M.ckey)
|
||||
GLOB.prey_digested_roundstat++
|
||||
|
||||
@@ -69,106 +69,6 @@
|
||||
for(var/msg in B.absorbed_struggle_messages_inside)
|
||||
belly_data["absorbed_struggle_messages_inside"] += msg
|
||||
|
||||
belly_data["escape_attempt_messages_owner"] = list()
|
||||
for(var/msg in B.escape_attempt_messages_owner)
|
||||
belly_data["escape_attempt_messages_owner"] += msg
|
||||
|
||||
belly_data["escape_attempt_messages_prey"] = list()
|
||||
for(var/msg in B.escape_attempt_messages_prey)
|
||||
belly_data["escape_attempt_messages_prey"] += msg
|
||||
|
||||
belly_data["escape_messages_owner"] = list()
|
||||
for(var/msg in B.escape_messages_owner)
|
||||
belly_data["escape_messages_owner"] += msg
|
||||
|
||||
belly_data["escape_messages_prey"] = list()
|
||||
for(var/msg in B.escape_messages_prey)
|
||||
belly_data["escape_messages_prey"] += msg
|
||||
|
||||
belly_data["escape_messages_outside"] = list()
|
||||
for(var/msg in B.escape_messages_outside)
|
||||
belly_data["escape_messages_outside"] += msg
|
||||
|
||||
belly_data["escape_item_messages_owner"] = list()
|
||||
for(var/msg in B.escape_item_messages_owner)
|
||||
belly_data["escape_item_messages_owner"] += msg
|
||||
|
||||
belly_data["escape_item_messages_prey"] = list()
|
||||
for(var/msg in B.escape_item_messages_prey)
|
||||
belly_data["escape_item_messages_prey"] += msg
|
||||
|
||||
belly_data["escape_item_messages_outside"] = list()
|
||||
for(var/msg in B.escape_item_messages_outside)
|
||||
belly_data["escape_item_messages_outside"] += msg
|
||||
|
||||
belly_data["escape_fail_messages_owner"] = list()
|
||||
for(var/msg in B.escape_fail_messages_owner)
|
||||
belly_data["escape_fail_messages_owner"] += msg
|
||||
|
||||
belly_data["escape_fail_messages_prey"] = list()
|
||||
for(var/msg in B.escape_fail_messages_prey)
|
||||
belly_data["escape_fail_messages_prey"] += msg
|
||||
|
||||
belly_data["escape_attempt_absorbed_messages_owner"] = list()
|
||||
for(var/msg in B.escape_attempt_absorbed_messages_owner)
|
||||
belly_data["escape_attempt_absorbed_messages_owner"] += msg
|
||||
|
||||
belly_data["escape_attempt_absorbed_messages_prey"] = list()
|
||||
for(var/msg in B.escape_attempt_absorbed_messages_prey)
|
||||
belly_data["escape_attempt_absorbed_messages_prey"] += msg
|
||||
|
||||
belly_data["escape_absorbed_messages_owner"] = list()
|
||||
for(var/msg in B.escape_absorbed_messages_owner)
|
||||
belly_data["escape_absorbed_messages_owner"] += msg
|
||||
|
||||
belly_data["escape_absorbed_messages_prey"] = list()
|
||||
for(var/msg in B.escape_absorbed_messages_prey)
|
||||
belly_data["escape_absorbed_messages_prey"] += msg
|
||||
|
||||
belly_data["escape_absorbed_messages_outside"] = list()
|
||||
for(var/msg in B.escape_absorbed_messages_outside)
|
||||
belly_data["escape_absorbed_messages_outside"] += msg
|
||||
|
||||
belly_data["escape_fail_absorbed_messages_owner"] = list()
|
||||
for(var/msg in B.escape_fail_absorbed_messages_owner)
|
||||
belly_data["escape_fail_absorbed_messages_owner"] += msg
|
||||
|
||||
belly_data["escape_fail_absorbed_messages_prey"] = list()
|
||||
for(var/msg in B.escape_fail_absorbed_messages_prey)
|
||||
belly_data["escape_fail_absorbed_messages_prey"] += msg
|
||||
|
||||
belly_data["primary_transfer_messages_owner"] = list()
|
||||
for(var/msg in B.primary_transfer_messages_owner)
|
||||
belly_data["primary_transfer_messages_owner"] += msg
|
||||
|
||||
belly_data["primary_transfer_messages_prey"] = list()
|
||||
for(var/msg in B.primary_transfer_messages_prey)
|
||||
belly_data["primary_transfer_messages_prey"] += msg
|
||||
|
||||
belly_data["secondary_transfer_messages_owner"] = list()
|
||||
for(var/msg in B.secondary_transfer_messages_owner)
|
||||
belly_data["secondary_transfer_messages_owner"] += msg
|
||||
|
||||
belly_data["secondary_transfer_messages_prey"] = list()
|
||||
for(var/msg in B.secondary_transfer_messages_prey)
|
||||
belly_data["secondary_transfer_messages_prey"] += msg
|
||||
|
||||
belly_data["digest_chance_messages_owner"] = list()
|
||||
for(var/msg in B.digest_chance_messages_owner)
|
||||
belly_data["digest_chance_messages_owner"] += msg
|
||||
|
||||
belly_data["digest_chance_messages_prey"] = list()
|
||||
for(var/msg in B.digest_chance_messages_prey)
|
||||
belly_data["digest_chance_messages_prey"] += msg
|
||||
|
||||
belly_data["absorb_chance_messages_owner"] = list()
|
||||
for(var/msg in B.absorb_chance_messages_owner)
|
||||
belly_data["absorb_chance_messages_owner"] += msg
|
||||
|
||||
belly_data["absorb_chance_messages_prey"] = list()
|
||||
for(var/msg in B.absorb_chance_messages_prey)
|
||||
belly_data["absorb_chance_messages_prey"] += msg
|
||||
|
||||
belly_data["digest_messages_owner"] = list()
|
||||
for(var/msg in B.digest_messages_owner)
|
||||
belly_data["digest_messages_owner"] += msg
|
||||
@@ -288,7 +188,6 @@
|
||||
belly_data["escapable"] = B.escapable
|
||||
|
||||
belly_data["escapechance"] = B.escapechance
|
||||
belly_data["escapechance_absorbed"] = B.escapechance_absorbed
|
||||
belly_data["escapetime"] = B.escapetime
|
||||
|
||||
belly_data["transferchance"] = B.transferchance
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
///// If user clicked on their grabbed target
|
||||
else if((src == G.affecting) && (attacker.a_intent == I_GRAB) && (attacker.zone_sel.selecting == BP_TORSO) && (is_vore_predator(G.affecting)))
|
||||
if(!G.affecting.feeding)
|
||||
to_chat(user, "<span class='vnotice'>[G.affecting] isn't willing to be fed.</span>")
|
||||
to_chat(user, "<span class='notice'>[G.affecting] isn't willing to be fed.</span>")
|
||||
log_and_message_admins("[key_name_admin(src)] attempted to feed themselves to [key_name_admin(G.affecting)] against their prefs ([G.affecting ? ADMIN_JMP(G.affecting) : "null"])")
|
||||
return FALSE
|
||||
|
||||
@@ -122,11 +122,11 @@
|
||||
///// If user clicked on anyone else but their grabbed target
|
||||
else if((src != G.affecting) && (src != G.assailant) && (is_vore_predator(src)))
|
||||
if(!feeding)
|
||||
to_chat(user, "<span class='vnotice'>[src] isn't willing to be fed.</span>")
|
||||
to_chat(user, "<span class='notice'>[src] isn't willing to be fed.</span>")
|
||||
log_and_message_admins("[key_name_admin(attacker)] attempted to feed [key_name_admin(G.affecting)] to [key_name_admin(src)] against predator's prefs ([src ? ADMIN_JMP(src) : "null"])")
|
||||
return FALSE
|
||||
if(!(G.affecting.devourable))
|
||||
to_chat(user, "<span class='vnotice'>[G.affecting] isn't able to be devoured.</span>")
|
||||
to_chat(user, "<span class='notice'>[G.affecting] isn't able to be devoured.</span>")
|
||||
log_and_message_admins("[key_name_admin(attacker)] attempted to feed [key_name_admin(G.affecting)] to [key_name_admin(src)] against prey's prefs ([G.affecting ? ADMIN_JMP(G.affecting) : "null"])")
|
||||
return FALSE
|
||||
if(attacker.feed_grabbed_to_other(attacker, G.affecting, src))
|
||||
@@ -364,7 +364,7 @@
|
||||
|
||||
setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
|
||||
visible_message("<span class='vwarning'>[src] licks [tasted]!</span>","<span class='vnotice'>You lick [tasted]. They taste rather like [tasted.get_taste_message()].</span>","<b>Slurp!</b>")
|
||||
visible_message("<span class='warning'>[src] licks [tasted]!</span>","<span class='notice'>You lick [tasted]. They taste rather like [tasted.get_taste_message()].</span>","<b>Slurp!</b>")
|
||||
|
||||
|
||||
/mob/living/proc/get_taste_message(allow_generic = 1)
|
||||
@@ -403,7 +403,7 @@
|
||||
return
|
||||
|
||||
setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
visible_message("<span class='vwarning'>[src] smells [smelled]!</span>","<span class='vnotice'>You smell [smelled]. They smell like [smelled.get_smell_message()].</span>","<b>Sniff!</b>")
|
||||
visible_message("<span class='warning'>[src] smells [smelled]!</span>","<span class='notice'>You smell [smelled]. They smell like [smelled.get_smell_message()].</span>","<b>Sniff!</b>")
|
||||
|
||||
/mob/living/proc/get_smell_message(allow_generic = 1)
|
||||
if(!vore_smell && !allow_generic)
|
||||
@@ -546,11 +546,11 @@
|
||||
return FALSE
|
||||
|
||||
if(!prey.devourable)
|
||||
to_chat(user, "<span class='vnotice'>They aren't able to be devoured.</span>")
|
||||
to_chat(user, "<span class='notice'>They aren't able to be devoured.</span>")
|
||||
log_and_message_admins("[key_name_admin(src)] attempted to devour [key_name_admin(prey)] against their prefs ([prey ? ADMIN_JMP(prey) : "null"])")
|
||||
return FALSE
|
||||
if(prey.absorbed || pred.absorbed)
|
||||
to_chat(user, "<span class='vwarning'>They aren't aren't in a state to be devoured.</span>")
|
||||
to_chat(user, "<span class='warning'>They aren't aren't in a state to be devoured.</span>")
|
||||
return FALSE
|
||||
|
||||
//Determining vore attempt privacy
|
||||
@@ -568,17 +568,17 @@
|
||||
// Slipnoms from chompstation downstream, credit to cadyn for the original PR.
|
||||
// Prepare messages
|
||||
if(prey.is_slipping)
|
||||
attempt_msg = "<span class='vwarning'>It seems like [prey] is about to slide into [pred]'s [lowertext(belly.name)]!</span>"
|
||||
success_msg = "<span class='vwarning'>[prey] suddenly slides into [pred]'s [lowertext(belly.name)]!</span>"
|
||||
attempt_msg = "<span class='warning'>It seems like [prey] is about to slide into [pred]'s [lowertext(belly.name)]!</span>"
|
||||
success_msg = "<span class='warning'>[prey] suddenly slides into [pred]'s [lowertext(belly.name)]!</span>"
|
||||
else if(pred.is_slipping)
|
||||
attempt_msg = "<span class='vwarning'>It seems like [prey] is gonna end up inside [pred]'s [lowertext(belly.name)] as [pred] comes sliding over!</span>"
|
||||
success_msg = "<span class='vwarning'>[prey] suddenly slips inside of [pred]'s [lowertext(belly.name)] as [pred] slides into them!</span>"
|
||||
attempt_msg = "<span class='warning'>It seems like [prey] is gonna end up inside [pred]'s [lowertext(belly.name)] as [pred] comes sliding over!</span>"
|
||||
success_msg = "<span class='warning'>[prey] suddenly slips inside of [pred]'s [lowertext(belly.name)] as [pred] slides into them!</span>"
|
||||
else if(user == pred) //Feeding someone to yourself
|
||||
attempt_msg = "<span class='vwarning'>[pred] is attempting to [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!</span>"
|
||||
success_msg = "<span class='vwarning'>[pred] manages to [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!</span>"
|
||||
attempt_msg = "<span class='warning'>[pred] is attempting to [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!</span>"
|
||||
success_msg = "<span class='warning'>[pred] manages to [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!</span>"
|
||||
else //Feeding someone to another person
|
||||
attempt_msg = "<span class='vwarning'>[user] is attempting to make [pred] [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!</span>"
|
||||
success_msg = "<span class='vwarning'>[user] manages to make [pred] [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!</span>"
|
||||
attempt_msg = "<span class='warning'>[user] is attempting to make [pred] [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!</span>"
|
||||
success_msg = "<span class='warning'>[user] manages to make [pred] [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!</span>"
|
||||
|
||||
// Announce that we start the attempt!
|
||||
|
||||
@@ -1116,126 +1116,50 @@
|
||||
for(var/belly in vore_organs)
|
||||
if(isbelly(belly))
|
||||
var/obj/belly/B = belly
|
||||
to_chat(src, "<span class='vnotice'><b>Belly name:</b> [B.name]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Belly desc:</b> [B.desc]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Belly absorbed desc:</b> [B.absorbed_desc]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Vore verb:</b> [B.vore_verb]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Struggle messages (outside):</b></span>")
|
||||
to_chat(src, "<span class='notice'><b>Belly name:</b> [B.name]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Belly desc:</b> [B.desc]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Belly absorbed desc:</b> [B.absorbed_desc]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Vore verb:</b> [B.vore_verb]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Struggle messages (outside):</b></span>")
|
||||
for(var/msg in B.struggle_messages_outside)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Struggle messages (inside):</b></span>")
|
||||
to_chat(src, "<span class='notice'>[msg]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Struggle messages (inside):</b></span>")
|
||||
for(var/msg in B.struggle_messages_inside)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Absorbed struggle messages (outside):</b></span>")
|
||||
to_chat(src, "<span class='notice'>[msg]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Absorbed struggle messages (outside):</b></span>")
|
||||
for(var/msg in B.absorbed_struggle_messages_outside)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Absorbed struggle messages (inside):</b></span>")
|
||||
to_chat(src, "<span class='notice'>[msg]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Absorbed struggle messages (inside):</b></span>")
|
||||
for(var/msg in B.absorbed_struggle_messages_inside)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Escape attempt messages (owner):</b></span>")
|
||||
for(var/msg in B.escape_attempt_messages_owner)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Escape attempt messages (prey):</b></span>")
|
||||
for(var/msg in B.escape_attempt_messages_prey)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Escape messages (owner):</b></span>")
|
||||
for(var/msg in B.escape_messages_owner)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Escape messages (prey):</b></span>")
|
||||
for(var/msg in B.escape_messages_prey)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Escape messages (outside):</b></span>")
|
||||
for(var/msg in B.escape_messages_outside)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Escape item messages (owner):</b></span>")
|
||||
for(var/msg in B.escape_item_messages_owner)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Escape item messages (prey):</b></span>")
|
||||
for(var/msg in B.escape_item_messages_prey)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Escape item messages (outside):</b></span>")
|
||||
for(var/msg in B.escape_item_messages_outside)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Escape fail messages (owner):</b></span>")
|
||||
for(var/msg in B.escape_fail_messages_owner)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Escape fail messages (prey):</b></span>")
|
||||
for(var/msg in B.escape_fail_messages_prey)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Absorbed escape attempt messages (owner):</b></span>")
|
||||
for(var/msg in B.escape_attempt_absorbed_messages_owner)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Absorbed escape attempt messages (prey):</b></span>")
|
||||
for(var/msg in B.escape_attempt_absorbed_messages_prey)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Absorbed escape messages (owner):</b></span>")
|
||||
for(var/msg in B.escape_absorbed_messages_owner)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Absorbed escape messages (prey):</b></span>")
|
||||
for(var/msg in B.escape_absorbed_messages_prey)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Absorbed escape messages (outside):</b></span>")
|
||||
for(var/msg in B.escape_absorbed_messages_outside)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Absorbed escape fail messages (owner):</b></span>")
|
||||
for(var/msg in B.escape_fail_absorbed_messages_owner)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Absorbed escape fail messages (prey):</b></span>")
|
||||
for(var/msg in B.escape_fail_absorbed_messages_prey)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Primary transfer messages (owner):</b></span>")
|
||||
for(var/msg in B.primary_transfer_messages_owner)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Primary transfer messages (prey):</b></span>")
|
||||
for(var/msg in B.primary_transfer_messages_prey)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Secondary transfer messages (owner):</b></span>")
|
||||
for(var/msg in B.secondary_transfer_messages_owner)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Secondary transfer messages (prey):</b></span>")
|
||||
for(var/msg in B.secondary_transfer_messages_prey)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Digest chance messages (owner):</b></span>")
|
||||
for(var/msg in B.digest_chance_messages_owner)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Digest chance messages (prey):</b></span>")
|
||||
for(var/msg in B.digest_chance_messages_prey)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Absorb chance messages (owner):</b></span>")
|
||||
for(var/msg in B.absorb_chance_messages_owner)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Absorb chance messages (prey):</b></span>")
|
||||
for(var/msg in B.absorb_chance_messages_prey)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Digest messages (owner):</b></span>")
|
||||
to_chat(src, "<span class='notice'>[msg]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Digest messages (owner):</b></span>")
|
||||
for(var/msg in B.digest_messages_owner)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Digest messages (prey):</b></span>")
|
||||
to_chat(src, "<span class='notice'>[msg]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Digest messages (prey):</b></span>")
|
||||
for(var/msg in B.digest_messages_prey)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Absorb messages (owner):</b></span>")
|
||||
to_chat(src, "<span class='notice'>[msg]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Absorb messages:</b></span>")
|
||||
for(var/msg in B.absorb_messages_owner)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Absorb messages (prey):</b></span>")
|
||||
to_chat(src, "<span class='notice'>[msg]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Absorb messages (prey):</b></span>")
|
||||
for(var/msg in B.absorb_messages_prey)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Unabsorb messages (owner):</b></span>")
|
||||
to_chat(src, "<span class='notice'>[msg]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Unabsorb messages:</b></span>")
|
||||
for(var/msg in B.unabsorb_messages_owner)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Unabsorb messages (prey):</b></span>")
|
||||
to_chat(src, "<span class='notice'>[msg]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Unabsorb messages (prey):</b></span>")
|
||||
for(var/msg in B.unabsorb_messages_prey)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Examine messages (when full):</b></span>")
|
||||
to_chat(src, "<span class='notice'>[msg]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Examine messages:</b></span>")
|
||||
for(var/msg in B.examine_messages)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Examine messages (with absorbed victims):</b></span>")
|
||||
to_chat(src, "<span class='notice'>[msg]</span>")
|
||||
for(var/msg in B.examine_messages_absorbed)
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='vnotice'><b>Emote lists:</b></span>")
|
||||
to_chat(src, "<span class='notice'>[msg]</span>")
|
||||
to_chat(src, "<span class='notice'><b>Emote lists:</b></span>")
|
||||
for(var/EL in B.emote_lists)
|
||||
to_chat(src, "<span class='vnotice'><b>[EL]:</b></span>")
|
||||
to_chat(src, "<span class='notice'><b>[EL]:</b></span>")
|
||||
for(var/msg in B.emote_lists[EL])
|
||||
to_chat(src, "<span class='vnotice'>[msg]</span>")
|
||||
to_chat(src, "<span class='notice'>[msg]</span>")
|
||||
|
||||
/**
|
||||
* Small helper component to manage the vore panel HUD icon
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
bellied = prey
|
||||
prey.forceMove(src)
|
||||
visible_message("[src] entirely engulfs [prey] in hardlight holograms!")
|
||||
to_chat(usr, "<span class='vnotice'>You completely engulf [prey] in hardlight holograms!</span>") //Can't be part of the above, because the above is from the hologram.
|
||||
to_chat(usr, "<span class='notice'>You completely engulf [prey] in hardlight holograms!</span>") //Can't be part of the above, because the above is from the hologram.
|
||||
|
||||
desc = "[initial(desc)] It seems to have hardlight mode enabled and someone inside."
|
||||
pass_flags = 0
|
||||
@@ -52,7 +52,7 @@
|
||||
|
||||
// Wrong state
|
||||
if (!eyeobj || !holo)
|
||||
to_chat(usr, "<span class='vwarning'>You can only use this when holo-projecting!</span>")
|
||||
to_chat(usr, "<span class='warning'>You can only use this when holo-projecting!</span>")
|
||||
return
|
||||
|
||||
//Holopads have this 'masters' list where the keys are AI names and the values are the hologram effects
|
||||
@@ -74,11 +74,11 @@
|
||||
return //Probably cancelled
|
||||
|
||||
if(!istype(prey))
|
||||
to_chat(usr, "<span class='vwarning'>Invalid mob choice!</span>")
|
||||
to_chat(usr, "<span class='warning'>Invalid mob choice!</span>")
|
||||
return
|
||||
|
||||
hologram.visible_message("[hologram] starts engulfing [prey] in hardlight holograms!")
|
||||
to_chat(src, "<span class='vnotice'>You begin engulfing [prey] in hardlight holograms.</span>") //Can't be part of the above, because the above is from the hologram.
|
||||
to_chat(src, "<span class='notice'>You begin engulfing [prey] in hardlight holograms.</span>") //Can't be part of the above, because the above is from the hologram.
|
||||
if(do_after(user=eyeobj,delay=50,target=prey,needhand=0) && holo && hologram && !hologram.bellied) //Didn't move and still projecting and effect exists and no other bellied people
|
||||
hologram.get_prey(prey)
|
||||
|
||||
|
||||
@@ -32,13 +32,13 @@
|
||||
M.Weaken(4)
|
||||
M.stop_flying()
|
||||
if(CanStumbleVore(M))
|
||||
visible_message("<span class='vwarning'>[M] flops carelessly into [src]!</span>")
|
||||
visible_message("<span class='warning'>[M] flops carelessly into [src]!</span>")
|
||||
perform_the_nom(src,M,src,src.vore_selected,1)
|
||||
else if(M.CanStumbleVore(src))
|
||||
visible_message("<span class='vwarning'>[M] flops carelessly into [src]!</span>")
|
||||
visible_message("<span class='warning'>[M] flops carelessly into [src]!</span>")
|
||||
perform_the_nom(M,src,M,M.vore_selected,1)
|
||||
else if(istype(S) && S.species.lightweight == 1)
|
||||
visible_message("<span class='vwarning'>[M] carelessly bowls [src] over!</span>")
|
||||
visible_message("<span class='warning'>[M] carelessly bowls [src] over!</span>")
|
||||
M.forceMove(get_turf(src))
|
||||
M.apply_damage(0.5, BRUTE)
|
||||
Weaken(4)
|
||||
@@ -46,9 +46,9 @@
|
||||
apply_damage(0.5, BRUTE)
|
||||
else if(round(weight) > 474)
|
||||
var/throwtarget = get_edge_target_turf(M, reverse_direction(M.dir))
|
||||
visible_message("<span class='vwarning'>[M] bounces backwards off of [src]'s plush body!</span>")
|
||||
visible_message("<span class='warning'>[M] bounces backwards off of [src]'s plush body!</span>")
|
||||
M.throw_at(throwtarget, 2, 1)
|
||||
else
|
||||
visible_message("<span class='vwarning'>[M] trips over [src]!</span>")
|
||||
visible_message("<span class='warning'>[M] trips over [src]!</span>")
|
||||
M.forceMove(get_turf(src))
|
||||
M.apply_damage(1, BRUTE)
|
||||
|
||||
@@ -11,5 +11,5 @@
|
||||
M.forceMove(egg)
|
||||
egg.name = egg_name
|
||||
if(message)
|
||||
to_chat(M, "<span class='vnotice'>You lose sensation of your body, feeling only the warmth around you as you're encased in an egg.</span>")
|
||||
to_chat(O, "<span class='vnotice'>Your body shifts as you encase [M] in an egg.</span>")
|
||||
to_chat(M, "<span class='notice'>You lose sensation of your body, feeling only the warmth around you as you're encased in an egg.</span>")
|
||||
to_chat(O, "<span class='notice'>Your body shifts as you encase [M] in an egg.</span>")
|
||||
|
||||
@@ -31,17 +31,17 @@
|
||||
if(!target)
|
||||
return
|
||||
|
||||
to_chat(target, "<span class='vwarning'>You feel yourself being pulled up by something... Or someone?!</span>")
|
||||
to_chat(target, "<span class='warning'>You feel yourself being pulled up by something... Or someone?!</span>")
|
||||
var/starting_loc = target.loc
|
||||
|
||||
if(do_after(src, 50))
|
||||
if(target.loc != starting_loc)
|
||||
to_chat(target, "<span class='vwarning'>You have interrupted whatever that was...</span>")
|
||||
to_chat(src, "<span class='vnotice'>They got away.</span>")
|
||||
to_chat(target, "<span class='warning'>You have interrupted whatever that was...</span>")
|
||||
to_chat(src, "<span class='notice'>They got away.</span>")
|
||||
return
|
||||
if(target.buckled)
|
||||
target.buckled.unbuckle_mob()
|
||||
target.visible_message("<span class='vwarning'>\The [target] suddenly disappears somewhere above!</span>",\
|
||||
"<span class='vdanger'>You are dragged above and feel yourself slipping directly into \the [src]'s [vore_selected]!</span>")
|
||||
to_chat(src, "<span class='vnotice'>You successfully snatch \the [target], slipping them into your [vore_selected].</span>")
|
||||
target.forceMove(src.vore_selected)
|
||||
target.visible_message("<span class='warning'>\The [target] suddenly disappears somewhere above!</span>",\
|
||||
"<span class='danger'>You are dragged above and feel yourself slipping directly into \the [src]'s [vore_selected]!</span>")
|
||||
to_chat(src, "<span class='notice'>You successfully snatch \the [target], slipping them into your [vore_selected].</span>")
|
||||
target.forceMove(src.vore_selected)
|
||||
@@ -252,7 +252,6 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
|
||||
selected_list["interacts"] = list()
|
||||
if(selected.escapable)
|
||||
selected_list["interacts"]["escapechance"] = selected.escapechance
|
||||
selected_list["interacts"]["escapechance_absorbed"] = selected.escapechance_absorbed
|
||||
selected_list["interacts"]["escapetime"] = selected.escapetime
|
||||
selected_list["interacts"]["transferchance"] = selected.transferchance
|
||||
selected_list["interacts"]["transferlocation"] = selected.transferlocation
|
||||
@@ -1062,130 +1061,6 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"asmi")
|
||||
|
||||
if("escap")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they try to escape from within you. Write them in 2nd person ('you start to X')."+help,"Escape Attempt Message (to prey)",host.vore_selected.get_messages("escap"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"escap")
|
||||
|
||||
if("escao")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey tries to escape from within you. Write them in 2nd person ('X ... from your Y')."+help,"Escape Attempt Message (to you)",host.vore_selected.get_messages("escao"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"escao")
|
||||
|
||||
if("escp")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they escape from within you. Write them in 2nd person ('you climb out of Y)."+help,"Escape Message (to prey)",host.vore_selected.get_messages("escp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"escp")
|
||||
|
||||
if("esco")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey escapes from within you. Write them in 2nd person ('X ... from your Y')."+help,"Escape Message (to you)",host.vore_selected.get_messages("esco"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"esco")
|
||||
|
||||
if("escout")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to those around you when prey escapes from within you. Write them in 3rd person ('X climbs out of Z's Y')."+help,"Escape Message (outside)",host.vore_selected.get_messages("escout"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"escout")
|
||||
|
||||
if("escip")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they manage to eject an item from within you. Write them in 2nd person ('you manage to O'). Use %item to refer to the ejected item in this type."+help,"Escape Item Message (to prey)",host.vore_selected.get_messages("escip"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"escip")
|
||||
|
||||
if("escio")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey manages to eject an item from within you. Write them in 2nd person ('O slips from Y'). Use %item to refer to the ejected item in this type."+help,"Escape Item Message (to you)",host.vore_selected.get_messages("escio"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"escio")
|
||||
|
||||
if("esciout")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to those around you when prey manages to eject an item from within you. Write them in 3rd person ('O from Y'). Use %item to refer to the ejected item in this type."+help,"Escape Item Message (outside)",host.vore_selected.get_messages("esciout"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"esciout")
|
||||
|
||||
if("escfp")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they fail to escape from within you. Write them in 2nd person ('you failed to Y')."+help,"Escape Fail Message (to prey)",host.vore_selected.get_messages("escfp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"escfp")
|
||||
|
||||
if("escfo")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey fails to escape from within you. Write them in 2nd person ('X failed ... your Y')."+help,"Escape Fail Message (to you)",host.vore_selected.get_messages("escfo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"escfo")
|
||||
|
||||
if("aescap")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to absorbed prey when they try to escape from within you. Write them in 2nd person ('you start to X')."+help,"Absorbed Escape Attempt Message (to prey)",host.vore_selected.get_messages("aescap"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"aescap")
|
||||
|
||||
if("aescao")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when absorbed prey tries to escape from within you. Write them in 2nd person ('X ... from your Y')."+help,"Absorbed Escape Attempt Message (to you)",host.vore_selected.get_messages("aescao"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"aescao")
|
||||
|
||||
if("aescp")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to absorbed prey when they escape from within you. Write them in 2nd person ('you escape from Y')."+help,"Absorbed Escape Message (to prey)",host.vore_selected.get_messages("aescp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"aescp")
|
||||
|
||||
if("aesco")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when absorbed prey escapes from within you. Write them in 2nd person ('X ... from your Y')."+help,"Absorbed Escape Message (to you)",host.vore_selected.get_messages("aesco"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"aesco")
|
||||
|
||||
if("aescout")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to those around you when absorbed prey escapes from within you. Write them in 3rd person ('X escapes from Z's Y')."+help,"Absorbed Escape Message (outside)",host.vore_selected.get_messages("aescout"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"aescout")
|
||||
|
||||
if("aescfp")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to absorbed prey when they fail to escape from within you. Write them in 2nd person ('you failed to Y')."+help,"Absorbed Escape Fail Message (to prey)",host.vore_selected.get_messages("aescfp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"aescfp")
|
||||
|
||||
if("aescfo")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when absorbed prey fails to escape from within you. Write them in 2nd person ('X failed ... your Y')."+help,"Absorbed Escape Fail Message (to you)",host.vore_selected.get_messages("aescfo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"aescfo")
|
||||
|
||||
if("trnspp")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they are automatically transferred into your primary destination. Write them in 2nd person ('you slide into Y'). Use %dest to refer to the target location in this type."+help,"Primary Transfer Message (to prey)",host.vore_selected.get_messages("trnspp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"trnspp")
|
||||
|
||||
if("trnspo")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey is automatically transferred into your primary destination. Write them in 2nd person ('X slid into your Y'). Use %dest to refer to the target location in this type."+help,"Primary Transfer Message (to you)",host.vore_selected.get_messages("trnspo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"trnspo")
|
||||
|
||||
if("trnssp")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they are automatically transferred into your secondary destination. Write them in 2nd person ('you slide into Y'). Use %dest to refer to the target location in this type."+help,"Secondary Transfer Message (to prey)",host.vore_selected.get_messages("trnssp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"trnssp")
|
||||
|
||||
if("trnsso")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey is automatically transferred into your primary destination. Write them in 2nd person ('X slid into your Y'). Use %dest to refer to the target location in this type."+help,"Secondary Transfer Message (to you)",host.vore_selected.get_messages("trnsso"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"trnsso")
|
||||
|
||||
if("stmodp")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they trigger the interaction digest chance. Write them in 2nd person ('you feel X')."+help,"Stomach Mode Digest Message (to prey)",host.vore_selected.get_messages("stmodp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"stmodp")
|
||||
|
||||
if("stmodo")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey triggers the interaction digest chance. Write them in 2nd person ('you feel X')."+help,"Stomach Mode Digest Message (to you)",host.vore_selected.get_messages("stmodo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"stmodo")
|
||||
|
||||
if("stmoap")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they trigger the interaction absorb chance. Write them in 2nd person ('you feel X')."+help,"Stomach Mode Digest Message (to prey)",host.vore_selected.get_messages("stmoap"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"stmoap")
|
||||
|
||||
if("stmoao")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey triggers the interaction absorb chance. Write them in 2nd person ('you feel X')."+help,"Stomach Mode Digest Message (to you)",host.vore_selected.get_messages("stmoao"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
host.vore_selected.set_messages(new_message,"stmoao")
|
||||
if("em")
|
||||
var/new_message = sanitize(tgui_input_text(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging')."+help,"Examine Message (when full)",host.vore_selected.get_messages("em"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
|
||||
if(new_message)
|
||||
@@ -1290,31 +1165,6 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
|
||||
host.vore_selected.struggle_messages_inside = initial(host.vore_selected.struggle_messages_inside)
|
||||
host.vore_selected.absorbed_struggle_messages_outside = initial(host.vore_selected.absorbed_struggle_messages_outside)
|
||||
host.vore_selected.absorbed_struggle_messages_inside = initial(host.vore_selected.absorbed_struggle_messages_inside)
|
||||
host.vore_selected.escape_attempt_messages_owner = initial(host.vore_selected.escape_attempt_messages_owner)
|
||||
host.vore_selected.escape_attempt_messages_prey = initial(host.vore_selected.escape_attempt_messages_prey)
|
||||
host.vore_selected.escape_messages_owner = initial(host.vore_selected.escape_messages_owner)
|
||||
host.vore_selected.escape_messages_prey = initial(host.vore_selected.escape_messages_prey)
|
||||
host.vore_selected.escape_messages_outside = initial(host.vore_selected.escape_messages_outside)
|
||||
host.vore_selected.escape_item_messages_owner = initial(host.vore_selected.escape_item_messages_owner)
|
||||
host.vore_selected.escape_item_messages_prey = initial(host.vore_selected.escape_item_messages_prey)
|
||||
host.vore_selected.escape_item_messages_outside = initial(host.vore_selected.escape_item_messages_outside)
|
||||
host.vore_selected.escape_fail_messages_owner = initial(host.vore_selected.escape_fail_messages_owner)
|
||||
host.vore_selected.escape_fail_messages_prey = initial(host.vore_selected.escape_fail_messages_prey)
|
||||
host.vore_selected.escape_attempt_absorbed_messages_owner = initial(host.vore_selected.escape_attempt_absorbed_messages_owner)
|
||||
host.vore_selected.escape_attempt_absorbed_messages_prey = initial(host.vore_selected.escape_attempt_absorbed_messages_prey)
|
||||
host.vore_selected.escape_absorbed_messages_owner = initial(host.vore_selected.escape_absorbed_messages_owner)
|
||||
host.vore_selected.escape_absorbed_messages_prey = initial(host.vore_selected.escape_absorbed_messages_prey)
|
||||
host.vore_selected.escape_absorbed_messages_outside = initial(host.vore_selected.escape_absorbed_messages_outside)
|
||||
host.vore_selected.escape_fail_absorbed_messages_owner = initial(host.vore_selected.escape_fail_absorbed_messages_owner)
|
||||
host.vore_selected.escape_fail_absorbed_messages_prey = initial(host.vore_selected.escape_fail_absorbed_messages_prey)
|
||||
host.vore_selected.primary_transfer_messages_owner = initial(host.vore_selected.primary_transfer_messages_owner)
|
||||
host.vore_selected.primary_transfer_messages_prey = initial(host.vore_selected.primary_transfer_messages_prey)
|
||||
host.vore_selected.secondary_transfer_messages_owner = initial(host.vore_selected.secondary_transfer_messages_owner)
|
||||
host.vore_selected.secondary_transfer_messages_prey = initial(host.vore_selected.secondary_transfer_messages_prey)
|
||||
host.vore_selected.digest_chance_messages_owner = initial(host.vore_selected.digest_chance_messages_owner)
|
||||
host.vore_selected.digest_chance_messages_prey = initial(host.vore_selected.digest_chance_messages_prey)
|
||||
host.vore_selected.absorb_chance_messages_owner = initial(host.vore_selected.absorb_chance_messages_owner)
|
||||
host.vore_selected.absorb_chance_messages_prey = initial(host.vore_selected.absorb_chance_messages_prey)
|
||||
host.vore_selected.examine_messages = initial(host.vore_selected.examine_messages)
|
||||
host.vore_selected.examine_messages_absorbed = initial(host.vore_selected.examine_messages_absorbed)
|
||||
host.vore_selected.emote_lists = initial(host.vore_selected.emote_lists)
|
||||
@@ -1531,11 +1381,6 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
|
||||
if(!isnull(escape_chance_input)) //These have to be 'null' because both cancel and 0 are valid, separate options
|
||||
host.vore_selected.escapechance = sanitize_integer(escape_chance_input, 0, 100, initial(host.vore_selected.escapechance))
|
||||
. = TRUE
|
||||
if("b_escapechance_absorbed")
|
||||
var/escape_absorbed_chance_input = tgui_input_number(user, "Set absorbed prey escape chance on resist (as %)", "Prey Absorbed Escape Chance", null, 100, 0)
|
||||
if(!isnull(escape_absorbed_chance_input)) //These have to be 'null' because both cancel and 0 are valid, separate options
|
||||
host.vore_selected.escapechance_absorbed = sanitize_integer(escape_absorbed_chance_input, 0, 100, initial(host.vore_selected.escapechance_absorbed))
|
||||
. = TRUE
|
||||
if("b_escapetime")
|
||||
var/escape_time_input = tgui_input_number(user, "Set number of seconds for prey to escape on resist (1-60)", "Prey Escape Time", null, 60, 1)
|
||||
if(!isnull(escape_time_input))
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
/// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
/// !!!!!!!!!!HEY LISTEN!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
/// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
// If you modify this file you ALSO need to modify tgui/packages/tgui-panel/styles/tgchat/chat-light.scss and chat-dark.scss
|
||||
// BUT you have to use PX font sizes with are on a x8 scale of these font sizes
|
||||
// Sample font-size: DM: 8 CSS: 64px
|
||||
|
||||
/client/script = {"<style>
|
||||
body {font-family: Verdana, sans-serif;}
|
||||
|
||||
@@ -19,10 +11,6 @@ em {font-style: normal;font-weight: bold;}
|
||||
.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover
|
||||
{color: #638500;}
|
||||
|
||||
.italics { font-style: italic;}
|
||||
|
||||
.bold { font-weight: bold;}
|
||||
|
||||
.prefix {font-weight: bold;}
|
||||
.log_message {color: #386AFF; font-weight: bold;}
|
||||
|
||||
|
Before Width: | Height: | Size: 97 KiB After Width: | Height: | Size: 97 KiB |
|
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 160 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 192 KiB |
|
Before Width: | Height: | Size: 646 KiB After Width: | Height: | Size: 643 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 188 KiB |
|
Before Width: | Height: | Size: 185 KiB After Width: | Height: | Size: 173 KiB |
@@ -1155,7 +1155,6 @@ window "mainwindow"
|
||||
saved-params = "pos;size;is-minimized;is-maximized"
|
||||
title = "VOREStation"
|
||||
is-maximized = true
|
||||
statusbar = false
|
||||
icon = 'icons\\virgoicon.png'
|
||||
macro = "macro"
|
||||
menu = "menu"
|
||||
@@ -1169,7 +1168,7 @@ window "mainwindow"
|
||||
saved-params = ""
|
||||
elem "hotkey_toggle"
|
||||
type = BUTTON
|
||||
pos = 560,400
|
||||
pos = 560,420
|
||||
size = 80x20
|
||||
anchor1 = 100,100
|
||||
anchor2 = -1,-1
|
||||
@@ -1180,7 +1179,7 @@ window "mainwindow"
|
||||
elem "mainvsplit"
|
||||
type = CHILD
|
||||
pos = 3,0
|
||||
size = 634x400
|
||||
size = 634x416
|
||||
anchor1 = 0,0
|
||||
anchor2 = 100,100
|
||||
saved-params = "splitter"
|
||||
@@ -1188,7 +1187,7 @@ window "mainwindow"
|
||||
is-vert = true
|
||||
elem "input"
|
||||
type = INPUT
|
||||
pos = 3,400
|
||||
pos = 3,420
|
||||
size = 517x20
|
||||
anchor1 = 0,100
|
||||
anchor2 = 100,100
|
||||
@@ -1196,19 +1195,9 @@ window "mainwindow"
|
||||
is-default = true
|
||||
border = sunken
|
||||
saved-params = "command"
|
||||
elem "status_bar"
|
||||
type = LABEL
|
||||
pos = 3,420
|
||||
size = 517x16
|
||||
anchor1 = 0,100
|
||||
anchor2 = 100,100
|
||||
is-visible = true
|
||||
text = ""
|
||||
align = left
|
||||
border = sunken
|
||||
elem "saybutton"
|
||||
type = BUTTON
|
||||
pos = 520,400
|
||||
pos = 520,420
|
||||
size = 40x20
|
||||
anchor1 = 100,100
|
||||
anchor2 = -1,-1
|
||||
@@ -1233,8 +1222,12 @@ window "mapwindow"
|
||||
anchor1 = -1,-1
|
||||
anchor2 = -1,-1
|
||||
saved-params = "pos;size;is-minimized;is-maximized"
|
||||
titlebar = false
|
||||
statusbar = false
|
||||
can-close = false
|
||||
can-minimize = false
|
||||
can-resize = false
|
||||
is-pane = true
|
||||
on-status = ".winset \"status_bar.text=[[*]]\" "
|
||||
elem "map"
|
||||
type = MAP
|
||||
pos = 0,0
|
||||
@@ -1257,28 +1250,46 @@ window "outputwindow"
|
||||
size = 640x480
|
||||
anchor1 = -1,-1
|
||||
anchor2 = -1,-1
|
||||
background-color = none
|
||||
saved-params = "pos;size;is-minimized;is-maximized"
|
||||
titlebar = false
|
||||
statusbar = false
|
||||
can-close = false
|
||||
can-minimize = false
|
||||
can-resize = false
|
||||
is-pane = true
|
||||
elem "browseroutput"
|
||||
elem "chatloadlabel"
|
||||
type = LABEL
|
||||
pos = 0,0
|
||||
size = 640x480
|
||||
anchor1 = 0,0
|
||||
anchor2 = 100,100
|
||||
font-family = "sans-serif"
|
||||
font-size = 24
|
||||
font-style = "bold"
|
||||
text-color = #ffffff
|
||||
background-color = #222222
|
||||
saved-params = ""
|
||||
text = "Chat is loading.\nIf nothing happens after 20s,\nuse OOC > \"Reload VChat\"."
|
||||
elem "htmloutput"
|
||||
type = BROWSER
|
||||
pos = 0,0
|
||||
size = 640x480
|
||||
anchor1 = 0,0
|
||||
anchor2 = 100,100
|
||||
is-visible = false
|
||||
is-disabled = true
|
||||
saved-params = ""
|
||||
elem "output"
|
||||
elem "oldoutput"
|
||||
type = OUTPUT
|
||||
pos = 0,0
|
||||
size = 640x480
|
||||
anchor1 = 0,0
|
||||
anchor2 = 100,100
|
||||
is-visible = false
|
||||
is-default = true
|
||||
saved-params = ""
|
||||
style = ".system {color:#FF0000;}"
|
||||
enable-http-images = true
|
||||
max-lines = 0
|
||||
|
||||
window "prefs_markings_subwindow"
|
||||
elem "prefs_markings_subwindow"
|
||||
@@ -1418,19 +1429,6 @@ window "rpane"
|
||||
is-checked = true
|
||||
group = "rpanemode"
|
||||
button-type = pushbox
|
||||
elem "infob"
|
||||
type = BUTTON
|
||||
pos = 60,0
|
||||
size = 60x16
|
||||
anchor1 = -1,-1
|
||||
anchor2 = -1,-1
|
||||
background-color = none
|
||||
is-visible = false
|
||||
saved-params = "is-checked"
|
||||
text = "Info"
|
||||
command = ".winset \"rpanewindow.left=infowindow\""
|
||||
group = "rpanemode"
|
||||
button-type = pushbox
|
||||
elem "mediapanel"
|
||||
type = BROWSER
|
||||
pos = 392,25
|
||||
|
||||
@@ -649,7 +649,7 @@ rules:
|
||||
## Enforce ES5 or ES6 class for React Components
|
||||
react/prefer-es6-class: error
|
||||
## Enforce that props are read-only
|
||||
react/prefer-read-only-props: off
|
||||
react/prefer-read-only-props: error
|
||||
## Enforce stateless React Components to be written as a pure function
|
||||
react/prefer-stateless-function: error
|
||||
## Prevent missing props validation in a React component definition
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "tgui-workspace",
|
||||
"version": "4.3.1",
|
||||
"version": "4.4.1",
|
||||
"packageManager": "yarn@3.3.1",
|
||||
"workspaces": [
|
||||
"packages/*"
|
||||
|
||||
@@ -19,4 +19,3 @@ export const toggleAcceptedType = createAction('chat/toggleAcceptedType');
|
||||
export const removeChatPage = createAction('chat/removePage');
|
||||
export const changeScrollTracking = createAction('chat/changeScrollTracking');
|
||||
export const saveChatToDisk = createAction('chat/saveToDisk');
|
||||
export const purgeChatMessageArchive = createAction('chat/purgeMessageArchive');
|
||||
|
||||
@@ -23,21 +23,15 @@ export const MESSAGE_TYPE_INTERNAL = 'internal';
|
||||
// Must match the set of defines in code/__DEFINES/chat.dm
|
||||
export const MESSAGE_TYPE_SYSTEM = 'system';
|
||||
export const MESSAGE_TYPE_LOCALCHAT = 'localchat';
|
||||
export const MESSAGE_TYPE_PLOCALCHAT = 'plocalchat';
|
||||
export const MESSAGE_TYPE_VORE = 'vore';
|
||||
export const MESSAGE_TYPE_RADIO = 'radio';
|
||||
export const MESSAGE_TYPE_NIF = 'nif';
|
||||
export const MESSAGE_TYPE_INFO = 'info';
|
||||
export const MESSAGE_TYPE_WARNING = 'warning';
|
||||
export const MESSAGE_TYPE_DEADCHAT = 'deadchat';
|
||||
export const MESSAGE_TYPE_OOC = 'ooc';
|
||||
export const MESSAGE_TYPE_LOOC = 'looc';
|
||||
export const MESSAGE_TYPE_ADMINPM = 'adminpm';
|
||||
export const MESSAGE_TYPE_MENTORPM = 'mentorpm';
|
||||
export const MESSAGE_TYPE_COMBAT = 'combat';
|
||||
export const MESSAGE_TYPE_ADMINCHAT = 'adminchat';
|
||||
export const MESSAGE_TYPE_MODCHAT = 'modchat';
|
||||
export const MESSAGE_TYPE_RLOOC = 'rlooc';
|
||||
export const MESSAGE_TYPE_PRAYER = 'prayer';
|
||||
export const MESSAGE_TYPE_EVENTCHAT = 'eventchat';
|
||||
export const MESSAGE_TYPE_ADMINLOG = 'adminlog';
|
||||
@@ -59,32 +53,14 @@ export const MESSAGE_TYPES = [
|
||||
type: MESSAGE_TYPE_LOCALCHAT,
|
||||
name: 'Local',
|
||||
description: 'In-character local messages (say, emote, etc)',
|
||||
selector: '.say, .emote, .emotesubtle',
|
||||
},
|
||||
{
|
||||
type: MESSAGE_TYPE_PLOCALCHAT,
|
||||
name: 'Local (Pred/Prey)',
|
||||
description: 'Messages from / to absorbed or dominated prey',
|
||||
selector: '.psay, .pemote',
|
||||
},
|
||||
{
|
||||
type: MESSAGE_TYPE_VORE,
|
||||
name: 'Vorgan Messages',
|
||||
description: 'Messages regarding vore interactions',
|
||||
selector: '.valert, .vwarning, .vnotice, .vdanger',
|
||||
selector: '.say, .emote',
|
||||
},
|
||||
{
|
||||
type: MESSAGE_TYPE_RADIO,
|
||||
name: 'Radio',
|
||||
description: 'All departments of radio messages',
|
||||
selector:
|
||||
'.alert, .minorannounce, .syndradio, .centradio, .airadio, .comradio, .secradio, .gangradio, .engradio, .medradio, .sciradio, .supradio, .srvradio, .expradio, .radio, .deptradio, .binarysay, .newscaster, .resonate, .abductor, .alien, .changeling',
|
||||
},
|
||||
{
|
||||
type: MESSAGE_TYPE_NIF,
|
||||
name: 'NIF',
|
||||
description: 'Messages from the NIF itself and people inside',
|
||||
selector: '.nif',
|
||||
'.alert, .minorannounce, .syndradio, .centcomradio, .aiprivradio, .comradio, .secradio, .gangradio, .engradio, .medradio, .sciradio, .suppradio, .servradio, .radio, .deptradio, .binarysay, .newscaster, .resonate, .abductor, .alien, .changeling',
|
||||
},
|
||||
{
|
||||
type: MESSAGE_TYPE_INFO,
|
||||
@@ -112,25 +88,12 @@ export const MESSAGE_TYPES = [
|
||||
description: 'The bluewall of global OOC messages',
|
||||
selector: '.ooc, .adminooc, .adminobserverooc, .oocplain',
|
||||
},
|
||||
{
|
||||
type: MESSAGE_TYPE_LOOC,
|
||||
name: 'Local OOC',
|
||||
description: 'Local OOC messages, always enabled',
|
||||
selector: '.looc',
|
||||
important: true,
|
||||
},
|
||||
{
|
||||
type: MESSAGE_TYPE_ADMINPM,
|
||||
name: 'Admin PMs',
|
||||
description: 'Messages to/from admins (adminhelp)',
|
||||
selector: '.pm, .adminhelp',
|
||||
},
|
||||
{
|
||||
type: MESSAGE_TYPE_MENTORPM,
|
||||
name: 'Mentor PMs',
|
||||
description: 'Mentorchat and mentor pms',
|
||||
selector: '.mentor_channel, .mentor',
|
||||
},
|
||||
{
|
||||
type: MESSAGE_TYPE_COMBAT,
|
||||
name: 'Combat Log',
|
||||
@@ -157,20 +120,6 @@ export const MESSAGE_TYPES = [
|
||||
selector: '.mod_channel',
|
||||
admin: true,
|
||||
},
|
||||
{
|
||||
type: MESSAGE_TYPE_EVENTCHAT,
|
||||
name: 'Event Chat',
|
||||
description: 'ESAY messages',
|
||||
selector: '.event_channel',
|
||||
admin: true,
|
||||
},
|
||||
{
|
||||
type: MESSAGE_TYPE_RLOOC,
|
||||
name: 'Remote LOOC',
|
||||
description: 'Remote LOOC messages',
|
||||
selector: '.rlooc',
|
||||
admin: true,
|
||||
},
|
||||
{
|
||||
type: MESSAGE_TYPE_PRAYER,
|
||||
name: 'Prayers',
|
||||
|
||||
@@ -8,7 +8,7 @@ import DOMPurify from 'dompurify';
|
||||
import { storage } from 'common/storage';
|
||||
import { loadSettings, updateSettings, addHighlightSetting, removeHighlightSetting, updateHighlightSetting } from '../settings/actions';
|
||||
import { selectSettings } from '../settings/selectors';
|
||||
import { addChatPage, changeChatPage, changeScrollTracking, loadChat, rebuildChat, removeChatPage, saveChatToDisk, purgeChatMessageArchive, toggleAcceptedType, updateMessageCount } from './actions';
|
||||
import { addChatPage, changeChatPage, changeScrollTracking, loadChat, rebuildChat, removeChatPage, saveChatToDisk, toggleAcceptedType, updateMessageCount } from './actions';
|
||||
import { MAX_PERSISTED_MESSAGES, MESSAGE_SAVE_INTERVAL } from './constants';
|
||||
import { createMessage, serializeMessage } from './model';
|
||||
import { chatRenderer } from './renderer';
|
||||
@@ -28,17 +28,12 @@ const saveChatToStorage = async (store) => {
|
||||
.map((message) => serializeMessage(message));
|
||||
storage.set('chat-state', state);
|
||||
storage.set('chat-messages', messages);
|
||||
storage.set(
|
||||
'chat-messages-archive',
|
||||
chatRenderer.archivedMessages.map((message) => serializeMessage(message))
|
||||
); // FIXME: Better chat history
|
||||
};
|
||||
|
||||
const loadChatFromStorage = async (store) => {
|
||||
const [state, messages, archivedMessages] = await Promise.all([
|
||||
const [state, messages] = await Promise.all([
|
||||
storage.get('chat-state'),
|
||||
storage.get('chat-messages'),
|
||||
storage.get('chat-messages-archive'), // FIXME: Better chat history
|
||||
]);
|
||||
// Discard incompatible versions
|
||||
if (state && state.version <= 4) {
|
||||
@@ -61,12 +56,8 @@ const loadChatFromStorage = async (store) => {
|
||||
];
|
||||
chatRenderer.processBatch(batch, {
|
||||
prepend: true,
|
||||
noarchive: true,
|
||||
});
|
||||
}
|
||||
if (archivedMessages) {
|
||||
chatRenderer.archivedMessages = archivedMessages;
|
||||
}
|
||||
store.dispatch(loadChat(state));
|
||||
};
|
||||
|
||||
@@ -182,10 +173,6 @@ export const chatMiddleware = (store) => {
|
||||
chatRenderer.saveToDisk();
|
||||
return;
|
||||
}
|
||||
if (type === purgeChatMessageArchive.type) {
|
||||
chatRenderer.purgeMessageArchive();
|
||||
return;
|
||||
}
|
||||
return next(action);
|
||||
};
|
||||
};
|
||||
|
||||
@@ -43,10 +43,10 @@ export const createMessage = (payload) => ({
|
||||
...payload,
|
||||
});
|
||||
|
||||
export const serializeMessage = (message, archive = false) => ({
|
||||
export const serializeMessage = (message) => ({
|
||||
type: message.type,
|
||||
text: message.text,
|
||||
html: archive ? message.node.outerHTML : message.html,
|
||||
html: message.html,
|
||||
times: message.times,
|
||||
createdAt: message.createdAt,
|
||||
});
|
||||
|
||||
@@ -9,7 +9,7 @@ import { classes } from 'common/react';
|
||||
import { createLogger } from 'tgui/logging';
|
||||
import { COMBINE_MAX_MESSAGES, COMBINE_MAX_TIME_WINDOW, IMAGE_RETRY_DELAY, IMAGE_RETRY_LIMIT, IMAGE_RETRY_MESSAGE_AGE, MAX_PERSISTED_MESSAGES, MAX_VISIBLE_MESSAGES, MESSAGE_PRUNE_INTERVAL, MESSAGE_TYPES, MESSAGE_TYPE_INTERNAL, MESSAGE_TYPE_UNKNOWN } from './constants';
|
||||
import { render } from 'inferno';
|
||||
import { canPageAcceptType, createMessage, isSameMessage, serializeMessage } from './model';
|
||||
import { canPageAcceptType, createMessage, isSameMessage } from './model';
|
||||
import { highlightNode, linkifyNode } from './replaceInTextNode';
|
||||
import { Tooltip } from '../../tgui/components';
|
||||
|
||||
@@ -111,7 +111,6 @@ class ChatRenderer {
|
||||
this.rootNode = null;
|
||||
this.queue = [];
|
||||
this.messages = [];
|
||||
this.archivedMessages = [];
|
||||
this.visibleMessages = [];
|
||||
this.page = null;
|
||||
this.events = new EventEmitter();
|
||||
@@ -323,7 +322,7 @@ class ChatRenderer {
|
||||
}
|
||||
|
||||
processBatch(batch, options = {}) {
|
||||
const { prepend, notifyListeners = true, noArchive = false } = options;
|
||||
const { prepend, notifyListeners = true } = options;
|
||||
const now = Date.now();
|
||||
// Queue up messages until chat is ready
|
||||
if (!this.isReady()) {
|
||||
@@ -460,9 +459,6 @@ class ChatRenderer {
|
||||
countByType[message.type] += 1;
|
||||
// TODO: Detect duplicates
|
||||
this.messages.push(message);
|
||||
if (!noArchive) {
|
||||
this.archivedMessages.push(serializeMessage(message, true)); // TODO: Actually having a better message archiving maybe for exports?
|
||||
}
|
||||
if (canPageAcceptType(this.page, message.type)) {
|
||||
fragment.appendChild(node);
|
||||
this.visibleMessages.push(message);
|
||||
@@ -572,12 +568,10 @@ class ChatRenderer {
|
||||
cssText += 'body, html { background-color: #141414 }\n';
|
||||
// Compile chat log as HTML text
|
||||
let messagesHtml = '';
|
||||
// for (let message of this.visibleMessages) { // TODO: Actually having a better message archiving maybe for exports?
|
||||
for (let message of this.archivedMessages) {
|
||||
// if (message.node) {
|
||||
// messagesHtml += message.node.outerHTML + '\n';
|
||||
// }
|
||||
messagesHtml += message.html + '\n';
|
||||
for (let message of this.visibleMessages) {
|
||||
if (message.node) {
|
||||
messagesHtml += message.node.outerHTML + '\n';
|
||||
}
|
||||
}
|
||||
// Create a page
|
||||
// prettier-ignore
|
||||
@@ -602,10 +596,6 @@ class ChatRenderer {
|
||||
.replace('T', '-');
|
||||
window.navigator.msSaveBlob(blob, `ss13-chatlog-${timestamp}.html`);
|
||||
}
|
||||
|
||||
purgeMessageArchive() {
|
||||
this.archivedMessages = [];
|
||||
}
|
||||
}
|
||||
|
||||
// Make chat renderer global so that we can continue using the same
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
// Themes
|
||||
import './styles/main.scss';
|
||||
import './styles/themes/light.scss';
|
||||
import './styles/themes/vchatdark.scss';
|
||||
|
||||
import { perf } from 'common/perf';
|
||||
import { combineReducers } from 'common/redux';
|
||||
|
||||
@@ -9,7 +9,7 @@ import { useLocalState } from 'tgui/backend';
|
||||
import { useDispatch, useSelector } from 'common/redux';
|
||||
import { Box, Button, ColorBox, Divider, Dropdown, Flex, Input, LabeledList, NumberInput, Section, Stack, Tabs, TextArea } from 'tgui/components';
|
||||
import { ChatPageSettings } from '../chat';
|
||||
import { rebuildChat, saveChatToDisk, purgeChatMessageArchive } from '../chat/actions';
|
||||
import { rebuildChat, saveChatToDisk } from '../chat/actions';
|
||||
import { THEMES } from '../themes';
|
||||
import { changeSettingsTab, updateSettings, addHighlightSetting, removeHighlightSetting, updateHighlightSetting } from './actions';
|
||||
import { SETTINGS_TABS, FONTS, MAX_HIGHLIGHT_SETTINGS } from './constants';
|
||||
@@ -56,11 +56,6 @@ export const SettingsGeneral = (props, context) => {
|
||||
);
|
||||
const dispatch = useDispatch(context);
|
||||
const [freeFont, setFreeFont] = useLocalState(context, 'freeFont', false);
|
||||
const [purgeConfirm, setPurgeConfirm] = useLocalState(
|
||||
context,
|
||||
'purgeConfirm',
|
||||
0
|
||||
);
|
||||
return (
|
||||
<Section>
|
||||
<LabeledList>
|
||||
@@ -160,29 +155,6 @@ export const SettingsGeneral = (props, context) => {
|
||||
<Button icon="save" onClick={() => dispatch(saveChatToDisk())}>
|
||||
Save chat log
|
||||
</Button>
|
||||
{purgeConfirm > 0 ? (
|
||||
<Button
|
||||
icon="trash"
|
||||
color="red"
|
||||
onClick={() => {
|
||||
dispatch(purgeChatMessageArchive());
|
||||
setPurgeConfirm(2);
|
||||
}}>
|
||||
{purgeConfirm > 1 ? 'Purged!' : 'Are you sure?'}
|
||||
</Button>
|
||||
) : (
|
||||
<Button
|
||||
icon="trash"
|
||||
color="red"
|
||||
onClick={() => {
|
||||
setPurgeConfirm(1);
|
||||
setTimeout(() => {
|
||||
setPurgeConfirm(false);
|
||||
}, 5000);
|
||||
}}>
|
||||
Purge message archive
|
||||
</Button>
|
||||
)}
|
||||
</Section>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -274,55 +274,6 @@ em {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.ooc .elevated {
|
||||
color: #2e78d9;
|
||||
}
|
||||
|
||||
.ooc .moderator {
|
||||
color: #184880;
|
||||
}
|
||||
|
||||
.ooc .developer {
|
||||
color: #1b521f;
|
||||
}
|
||||
|
||||
.ooc .admin {
|
||||
color: #b82e00;
|
||||
}
|
||||
|
||||
.ooc .event_manager {
|
||||
color: #660033;
|
||||
}
|
||||
|
||||
.ooc .aooc {
|
||||
color: #960018;
|
||||
}
|
||||
|
||||
img.text_tag {
|
||||
width: 32px;
|
||||
height: 10px;
|
||||
min-height: 10px;
|
||||
}
|
||||
|
||||
/*BIG IMG.icon {width: 32px; height: 32px;}*/
|
||||
img.icon {
|
||||
vertical-align: middle;
|
||||
max-height: 1em;
|
||||
}
|
||||
img.icon.bigicon {
|
||||
max-height: 32px;
|
||||
}
|
||||
|
||||
.looc {
|
||||
color: #3a9696;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.rlooc {
|
||||
color: #3abb96;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.adminobserverooc {
|
||||
color: #0099cc;
|
||||
font-weight: bold;
|
||||
@@ -343,26 +294,6 @@ img.icon.bigicon {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.mentor_channel {
|
||||
color: #808000;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.mod_channel {
|
||||
color: #735638;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.admin_channel {
|
||||
color: #9611d4;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.event_channel {
|
||||
color: #cc3399;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.name {
|
||||
font-weight: bold;
|
||||
}
|
||||
@@ -374,19 +305,6 @@ img.icon.bigicon {
|
||||
.warningplain {
|
||||
}
|
||||
|
||||
.nif {
|
||||
}
|
||||
|
||||
.psay {
|
||||
color: #e300e4;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.pemote {
|
||||
color: #e300e4;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.deadsay {
|
||||
color: #e2c1ff;
|
||||
}
|
||||
@@ -416,7 +334,7 @@ img.icon.bigicon {
|
||||
}
|
||||
|
||||
.comradio {
|
||||
color: #57b8f0;
|
||||
color: #fcdf03;
|
||||
}
|
||||
|
||||
.secradio {
|
||||
@@ -424,25 +342,21 @@ img.icon.bigicon {
|
||||
}
|
||||
|
||||
.medradio {
|
||||
color: #57f09e;
|
||||
color: #57b8f0;
|
||||
}
|
||||
|
||||
.engradio {
|
||||
color: #fcdf03;
|
||||
color: #f37746;
|
||||
}
|
||||
|
||||
.supradio {
|
||||
.suppradio {
|
||||
color: #b88646;
|
||||
}
|
||||
|
||||
.srvradio {
|
||||
.servradio {
|
||||
color: #6ca729;
|
||||
}
|
||||
|
||||
.expradio {
|
||||
color: #8a8a8a;
|
||||
}
|
||||
|
||||
.syndradio {
|
||||
color: #8f4a4b;
|
||||
}
|
||||
@@ -451,11 +365,11 @@ img.icon.bigicon {
|
||||
color: #ac2ea1;
|
||||
}
|
||||
|
||||
.centradio {
|
||||
.centcomradio {
|
||||
color: #2681a5;
|
||||
}
|
||||
|
||||
.airadio {
|
||||
.aiprivradio {
|
||||
color: #d65d95;
|
||||
}
|
||||
|
||||
@@ -483,10 +397,6 @@ img.icon.bigicon {
|
||||
color: #d82020;
|
||||
}
|
||||
|
||||
.valert {
|
||||
color: #d82020;
|
||||
}
|
||||
|
||||
.userdanger {
|
||||
color: #c51e1e;
|
||||
font-weight: bold;
|
||||
@@ -502,20 +412,11 @@ img.icon.bigicon {
|
||||
color: #c51e1e;
|
||||
}
|
||||
|
||||
.vdanger {
|
||||
color: #c51e1e;
|
||||
}
|
||||
|
||||
.warning {
|
||||
color: #c51e1e;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.vwarning {
|
||||
color: #c51e1e;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.alertwarning {
|
||||
color: #ff0000;
|
||||
font-weight: bold;
|
||||
@@ -582,10 +483,6 @@ img.icon.bigicon {
|
||||
color: #6685f5;
|
||||
}
|
||||
|
||||
.vnotice {
|
||||
color: #6685f5;
|
||||
}
|
||||
|
||||
.tinynotice {
|
||||
color: #6685f5;
|
||||
font-size: 85%;
|
||||
@@ -632,11 +529,6 @@ img.icon.bigicon {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.log_message {
|
||||
color: #386aff;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.unconscious {
|
||||
color: #a4bad6;
|
||||
font-weight: bold;
|
||||
@@ -801,7 +693,7 @@ img.icon.bigicon {
|
||||
}
|
||||
|
||||
.changeling {
|
||||
color: #b000b1;
|
||||
color: #059223;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@@ -1217,124 +1109,3 @@ $border-width-px: $border-width * 1px;
|
||||
background-color: darken(map.get($alert-stripe-colors, $color-name), 5);
|
||||
}
|
||||
}
|
||||
|
||||
// Extra Languages
|
||||
.tajaran {
|
||||
color: #803b56;
|
||||
}
|
||||
|
||||
.tajaran_signlang {
|
||||
color: #941c1c;
|
||||
}
|
||||
|
||||
.akhani {
|
||||
color: #ac398c;
|
||||
}
|
||||
|
||||
.skrell {
|
||||
color: #00b0b3;
|
||||
}
|
||||
|
||||
.skrellfar {
|
||||
color: #70fcff;
|
||||
}
|
||||
|
||||
.soghun {
|
||||
color: #50ba6c;
|
||||
}
|
||||
|
||||
.solcom {
|
||||
color: #6da6f0;
|
||||
}
|
||||
|
||||
.sergal {
|
||||
color: #0077ff;
|
||||
}
|
||||
|
||||
.birdsongc {
|
||||
color: #cc9900;
|
||||
}
|
||||
|
||||
.vulpkanin {
|
||||
color: #b97a57;
|
||||
}
|
||||
|
||||
.tavan {
|
||||
color: #f54298;
|
||||
font-family: Arial;
|
||||
}
|
||||
|
||||
.echosong {
|
||||
color: #826d8c;
|
||||
}
|
||||
|
||||
.enochian {
|
||||
color: #848a33;
|
||||
letter-spacing: -1pt;
|
||||
word-spacing: 4pt;
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Grande', sans-serif;
|
||||
}
|
||||
|
||||
.daemon {
|
||||
color: #5e339e;
|
||||
letter-spacing: -1pt;
|
||||
word-spacing: 0pt;
|
||||
font-family: 'Courier New', Courier, monospace;
|
||||
}
|
||||
|
||||
.drudakar {
|
||||
color: #bb2463;
|
||||
word-spacing: 0pt;
|
||||
font-family: 'High Tower Text', monospace;
|
||||
}
|
||||
|
||||
.bug {
|
||||
color: #9e9e39;
|
||||
}
|
||||
|
||||
.vox {
|
||||
color: #aa00aa;
|
||||
}
|
||||
|
||||
.promethean {
|
||||
color: #a5a5a5;
|
||||
font-family: 'Comic Sans MS', 'Comic Sans', cursive;
|
||||
}
|
||||
|
||||
.zaddat {
|
||||
color: #941c1c;
|
||||
}
|
||||
|
||||
.rough {
|
||||
font-family: 'Trebuchet MS', cursive, sans-serif;
|
||||
}
|
||||
|
||||
.say_quote {
|
||||
font-family: Georgia, Verdana, sans-serif;
|
||||
}
|
||||
|
||||
.say_quote_italics {
|
||||
font-style: italic;
|
||||
font-family: Georgia, Verdana, sans-serif;
|
||||
}
|
||||
|
||||
.terminus {
|
||||
font-family: 'Times New Roman', Times, serif, sans-serif;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
color: #9c660b;
|
||||
}
|
||||
|
||||
.teppi {
|
||||
color: #816540;
|
||||
word-spacing: 4pt;
|
||||
font-family: 'Segoe Script Bold', 'Segoe Script', sans-serif, Verdana;
|
||||
}
|
||||
|
||||
.shadekin {
|
||||
color: #be3cc5;
|
||||
font-size: 150%;
|
||||
font-weight: bold;
|
||||
font-family: 'Gabriola', cursive, sans-serif;
|
||||
}
|
||||
|
||||
@@ -292,55 +292,6 @@ em {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.ooc .elevated {
|
||||
color: #2e78d9;
|
||||
}
|
||||
|
||||
.ooc .moderator {
|
||||
color: #184880;
|
||||
}
|
||||
|
||||
.ooc .developer {
|
||||
color: #1b521f;
|
||||
}
|
||||
|
||||
.ooc .admin {
|
||||
color: #b82e00;
|
||||
}
|
||||
|
||||
.ooc .event_manager {
|
||||
color: #660033;
|
||||
}
|
||||
|
||||
.ooc .aooc {
|
||||
color: #960018;
|
||||
}
|
||||
|
||||
img.text_tag {
|
||||
width: 32px;
|
||||
height: 10px;
|
||||
min-height: 10px;
|
||||
}
|
||||
|
||||
/*BIG IMG.icon {width: 32px; height: 32px;}*/
|
||||
img.icon {
|
||||
vertical-align: middle;
|
||||
max-height: 1em;
|
||||
}
|
||||
img.icon.bigicon {
|
||||
max-height: 32px;
|
||||
}
|
||||
|
||||
.looc {
|
||||
color: #3a9696;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.rlooc {
|
||||
color: #3abb96;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.adminobserverooc {
|
||||
color: #0099cc;
|
||||
font-weight: bold;
|
||||
@@ -361,26 +312,6 @@ img.icon.bigicon {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.mentor_channel {
|
||||
color: #808000;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.mod_channel {
|
||||
color: #735638;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.admin_channel {
|
||||
color: #9611d4;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.event_channel {
|
||||
color: #cc3399;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.name {
|
||||
font-weight: bold;
|
||||
}
|
||||
@@ -392,19 +323,6 @@ img.icon.bigicon {
|
||||
.warningplain {
|
||||
}
|
||||
|
||||
.nif {
|
||||
}
|
||||
|
||||
.psay {
|
||||
color: #800080;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.pemote {
|
||||
color: #800080;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.deadsay {
|
||||
color: #5c00e6;
|
||||
}
|
||||
@@ -433,7 +351,7 @@ img.icon.bigicon {
|
||||
}
|
||||
|
||||
.comradio {
|
||||
color: #337296;
|
||||
color: #948f02;
|
||||
}
|
||||
|
||||
.secradio {
|
||||
@@ -441,25 +359,21 @@ img.icon.bigicon {
|
||||
}
|
||||
|
||||
.medradio {
|
||||
color: #339661;
|
||||
color: #337296;
|
||||
}
|
||||
|
||||
.engradio {
|
||||
color: #948f02;
|
||||
color: #fb5613;
|
||||
}
|
||||
|
||||
.supradio {
|
||||
.suppradio {
|
||||
color: #a8732b;
|
||||
}
|
||||
|
||||
.srvradio {
|
||||
.servradio {
|
||||
color: #6eaa2c;
|
||||
}
|
||||
|
||||
.expradio {
|
||||
color: #555555;
|
||||
}
|
||||
|
||||
.syndradio {
|
||||
color: #6d3f40;
|
||||
}
|
||||
@@ -468,11 +382,11 @@ img.icon.bigicon {
|
||||
color: #ac2ea1;
|
||||
}
|
||||
|
||||
.centradio {
|
||||
.centcomradio {
|
||||
color: #686868;
|
||||
}
|
||||
|
||||
.airadio {
|
||||
.aiprivradio {
|
||||
color: #ff00ff;
|
||||
}
|
||||
|
||||
@@ -500,10 +414,6 @@ img.icon.bigicon {
|
||||
color: #ff0000;
|
||||
}
|
||||
|
||||
.valert {
|
||||
color: #ff0000;
|
||||
}
|
||||
|
||||
h1.alert,
|
||||
h2.alert {
|
||||
color: #000000;
|
||||
@@ -524,10 +434,6 @@ h2.alert {
|
||||
color: #ff0000;
|
||||
}
|
||||
|
||||
.vdanger {
|
||||
color: #ff0000;
|
||||
}
|
||||
|
||||
.tinydanger {
|
||||
color: #ff0000;
|
||||
font-size: 85%;
|
||||
@@ -543,11 +449,6 @@ h2.alert {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.vwarning {
|
||||
color: #ff0000;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.alertwarning {
|
||||
color: #ff0000;
|
||||
font-weight: bold;
|
||||
@@ -614,10 +515,6 @@ h2.alert {
|
||||
color: #000099;
|
||||
}
|
||||
|
||||
.vnotice {
|
||||
color: #000099;
|
||||
}
|
||||
|
||||
.tinynotice {
|
||||
color: #000099;
|
||||
font-size: 85%;
|
||||
@@ -659,11 +556,6 @@ h2.alert {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.log_message {
|
||||
color: #386aff;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.unconscious {
|
||||
color: #0000ff;
|
||||
font-weight: bold;
|
||||
@@ -1250,124 +1142,3 @@ $border-width-px: $border-width * 1px;
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Extra Languages
|
||||
.tajaran {
|
||||
color: #803b56;
|
||||
}
|
||||
|
||||
.tajaran_signlang {
|
||||
color: #941c1c;
|
||||
}
|
||||
|
||||
.akhani {
|
||||
color: #ac398c;
|
||||
}
|
||||
|
||||
.skrell {
|
||||
color: #00b0b3;
|
||||
}
|
||||
|
||||
.skrellfar {
|
||||
color: #70fcff;
|
||||
}
|
||||
|
||||
.soghun {
|
||||
color: #50ba6c;
|
||||
}
|
||||
|
||||
.solcom {
|
||||
color: #3333ce;
|
||||
}
|
||||
|
||||
.sergal {
|
||||
color: #0077ff;
|
||||
}
|
||||
|
||||
.birdsongc {
|
||||
color: #cc9900;
|
||||
}
|
||||
|
||||
.vulpkanin {
|
||||
color: #b97a57;
|
||||
}
|
||||
|
||||
.tavan {
|
||||
color: #f54298;
|
||||
font-family: Arial;
|
||||
}
|
||||
|
||||
.echosong {
|
||||
color: #826d8c;
|
||||
}
|
||||
|
||||
.enochian {
|
||||
color: #848a33;
|
||||
letter-spacing: -1pt;
|
||||
word-spacing: 4pt;
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Grande', sans-serif;
|
||||
}
|
||||
|
||||
.daemon {
|
||||
color: #5e339e;
|
||||
letter-spacing: -1pt;
|
||||
word-spacing: 0pt;
|
||||
font-family: 'Courier New', Courier, monospace;
|
||||
}
|
||||
|
||||
.drudakar {
|
||||
color: #bb2463;
|
||||
word-spacing: 0pt;
|
||||
font-family: 'High Tower Text', monospace;
|
||||
}
|
||||
|
||||
.bug {
|
||||
color: #9e9e39;
|
||||
}
|
||||
|
||||
.vox {
|
||||
color: #aa00aa;
|
||||
}
|
||||
|
||||
.promethean {
|
||||
color: #5a5a5a;
|
||||
font-family: 'Comic Sans MS', 'Comic Sans', cursive;
|
||||
}
|
||||
|
||||
.zaddat {
|
||||
color: #941c1c;
|
||||
}
|
||||
|
||||
.rough {
|
||||
font-family: 'Trebuchet MS', cursive, sans-serif;
|
||||
}
|
||||
|
||||
.say_quote {
|
||||
font-family: Georgia, Verdana, sans-serif;
|
||||
}
|
||||
|
||||
.say_quote_italics {
|
||||
font-style: italic;
|
||||
font-family: Georgia, Verdana, sans-serif;
|
||||
}
|
||||
|
||||
.terminus {
|
||||
font-family: 'Times New Roman', Times, serif, sans-serif;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
color: #9c660b;
|
||||
}
|
||||
|
||||
.teppi {
|
||||
color: #816540;
|
||||
word-spacing: 4pt;
|
||||
font-family: 'Segoe Script Bold', 'Segoe Script', sans-serif, Verdana;
|
||||
}
|
||||
|
||||
.shadekin {
|
||||
color: #be3cc5;
|
||||
font-size: 150%;
|
||||
font-weight: bold;
|
||||
font-family: 'Gabriola', cursive, sans-serif;
|
||||
}
|
||||
|
||||