diff --git a/code/__defines/chat.dm b/code/__defines/chat.dm index e1acf03d64..70ac35bada 100644 --- a/code/__defines/chat.dm +++ b/code/__defines/chat.dm @@ -15,6 +15,7 @@ #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" diff --git a/code/modules/mob/mob_grab_specials.dm b/code/modules/mob/mob_grab_specials.dm index a7a9d45db7..4ac26e4e13 100644 --- a/code/modules/mob/mob_grab_specials.dm +++ b/code/modules/mob/mob_grab_specials.dm @@ -1,4 +1,3 @@ - /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) @@ -163,12 +162,12 @@ if(can_eat) var/mob/living/carbon/attacker = user - user.visible_message("[user] is attempting to devour [target]!") + user.visible_message("[user] is attempting to devour [target]!") 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("[user] devours [target]!") + user.visible_message("[user] devours [target]!") target.loc = user attacker.stomach_contents.Add(target) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/vchat/css/ss13styles.css b/code/modules/vchat/css/ss13styles.css index ede9047ac7..f5cce8a32a 100644 --- a/code/modules/vchat/css/ss13styles.css +++ b/code/modules/vchat/css/ss13styles.css @@ -129,6 +129,7 @@ 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 {} @@ -147,12 +148,16 @@ 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;} @@ -190,8 +195,8 @@ h1.alert, h2.alert {color: #000000;} .terminus {font-family: "Times New Roman", Times, serif, sans-serif} .interface {color: #330033;} /* YW Edit start */ -.psionic {color: #993399;} -.wingdings {font-family: Wingdings, Webdings} +.psionic {color: #993399;} +.wingdings {font-family: Wingdings, Webdings} /* YW Edit End */ .spacer {color: #9c660b;} /* VOREStation Add */ .blob {color: #ff950d; font-weight: bold; font-style: italic;} diff --git a/code/modules/vchat/js/vchat.js b/code/modules/vchat/js/vchat.js index 557c4c5140..df41549015 100644 --- a/code/modules/vchat/js/vchat.js +++ b/code/modules/vchat/js/vchat.js @@ -176,6 +176,14 @@ 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", diff --git a/code/modules/vchat/js/vchat.min.js b/code/modules/vchat/js/vchat.min.js index 915fcac4bb..e8c0c2a515 100644 --- a/code/modules/vchat/js/vchat.min.js +++ b/code/modules/vchat/js/vchat.min.js @@ -1,5 +1 @@ -<<<<<<< HEAD -!function(){var e=console.log;console.log=function(t){send_debug(t),e.apply(console,arguments)};var t=console.error;console.error=function(e){send_debug(e),t.apply(console,arguments)},window.onerror=function(e,t,s,a,n){var o="";return n&&n.stack&&(o=n.stack),send_debug(e+" ("+t+"@"+s+":"+a+") "+n+"|UA: "+navigator.userAgent+"|Stack: "+o),!0}}();var vueapp,vchat_opts={msBeforeDropped:3e4,cookiePrefix:"vst-",alwaysShow:["vc_looc","vc_system"],vchatTabsVer:1},DARKMODE_COLORS={buttonBgColor:"#40628a",buttonTextColor:"#FFFFFF",windowBgColor:"#272727",highlightColor:"#009900",tabTextColor:"#FFFFFF",tabBackgroundColor:"#272727"},LIGHTMODE_COLORS={buttonBgColor:"none",buttonTextColor:"#000000",windowBgColor:"none",highlightColor:"#007700",tabTextColor:"#000000",tabBackgroundColor:"none"},set_storage=set_cookie,get_storage=get_cookie,domparser=new DOMParser;storageAvailable("localStorage")&&(set_storage=set_localstorage,get_storage=get_localstorage);var vchat_state={ready:!1,byond_ip:null,byond_cid:null,byond_ckey:null,lastPingReceived:0,latency_sent:0,lastId:0};function start_vchat(){start_vue(),vchat_state.ready=!0,push_Topic("done_loading"),push_Topic_showingnum(this.showingnum),doWinset("htmloutput",{"is-visible":!0}),doWinset("oldoutput",{"is-visible":!1}),doWinset("chatloadlabel",{"is-visible":!1}),setInterval(check_ping,vchat_opts.msBeforeDropped),send_debug("VChat Loaded!")}function start_vue(){vueapp=new Vue({el:"#app",data:{messages:[],shown_messages:[],unshown_messages:0,archived_messages:[],tabs:[{name:"Main",categories:[],immutable:!0,active:!0}],unread_messages:{},editing:!1,paused:!1,latency:0,reconnecting:!1,ext_styles:"",is_admin:!1,inverted:!1,crushing:3,animated:!1,fontsize:.9,lineheight:130,showingnum:200,type_table:[{matches:".filter_say, .say, .emote, .emotesubtle",becomes:"vc_localchat",pretty:"Local Chat",tooltip:"In-character local messages (say, emote, etc)",required:!1,admin:!1},{matches:".filter_radio, .alert, .syndradio, .centradio, .airadio, .entradio, .comradio, .secradio, .engradio, .medradio, .sciradio, .supradio, .srvradio, .expradio, .radio, .deptradio, .newscaster",becomes:"vc_radio",pretty:"Radio Comms",tooltip:"All departments of radio messages",required:!1,admin:!1},{matches:".filter_notice, .notice:not(.pm), .adminnotice, .info, .sinister, .cult",becomes:"vc_info",pretty:"Notices",tooltip:"Non-urgent messages from the game and items",required:!1,admin:!1},{matches:".filter_warning, .warning:not(.pm), .critical, .userdanger, .italics",becomes:"vc_warnings",pretty:"Warnings",tooltip:"Urgent messages from the game and items",required:!1,admin:!1},{matches:".filter_deadsay, .deadsay",becomes:"vc_deadchat",pretty:"Deadchat",tooltip:"All of deadchat",required:!1,admin:!1},{matches:".filter_pray",becomes:"vc_pray",pretty:"Pray",tooltip:"Prayer messages",required:!1,admin:!1},{matches:".ooc, .filter_ooc",becomes:"vc_globalooc",pretty:"Global OOC",tooltip:"The bluewall of global OOC messages",required:!1,admin:!1},{matches:".nif",becomes:"vc_nif",pretty:"NIF Messages",tooltip:"Messages from the NIF itself and people inside",required:!1,admin:!1},{matches:".psay, .pemote",becomes:"vc_pmessage",pretty:"Pred/Prey Messages",tooltip:"Messages from / to absorbed or dominated prey",required:!1,admin:!1},{matches:".mentor_channel, .mentor",becomes:"vc_mentor",pretty:"Mentor messages",tooltip:"Mentorchat and mentor pms",required:!1,admin:!1},{matches:".filter_pm, .pm",becomes:"vc_adminpm",pretty:"Admin PMs",tooltip:"Messages to/from admins ('adminhelps')",required:!1,admin:!1},{matches:".filter_ASAY, .admin_channel",becomes:"vc_adminchat",pretty:"Admin Chat",tooltip:"ASAY messages",required:!1,admin:!0},{matches:".filter_MSAY, .mod_channel",becomes:"vc_modchat",pretty:"Mod Chat",tooltip:"MSAY messages",required:!1,admin:!0},{matches:".filter_ESAY, .event_channel",becomes:"vc_eventchat",pretty:"Event Chat",tooltip:"ESAY messages",required:!1,admin:!0},{matches:".filter_combat, .danger",becomes:"vc_combat",pretty:"Combat Logs",tooltip:"Urist McTraitor has stabbed you with a knife!",required:!1,admin:!1},{matches:".filter_adminlogs, .log_message",becomes:"vc_adminlogs",pretty:"Admin Logs",tooltip:"ADMIN LOG: Urist McAdmin has jumped to coordinates X, Y, Z",required:!1,admin:!0},{matches:".filter_attacklogs",becomes:"vc_attacklogs",pretty:"Attack Logs",tooltip:"Urist McTraitor has shot John Doe",required:!1,admin:!0},{matches:".filter_debuglogs",becomes:"vc_debuglogs",pretty:"Debug Logs",tooltip:"DEBUG: SSPlanets subsystem Recover().",required:!1,admin:!0},{matches:".looc",becomes:"vc_looc",pretty:"Local OOC",tooltip:"Local OOC messages, always enabled",required:!0},{matches:".rlooc",becomes:"vc_rlooc",pretty:"Remote LOOC",tooltip:"Remote LOOC messages",required:!1,admin:!0},{matches:".boldannounce, .filter_system",becomes:"vc_system",pretty:"System Messages",tooltip:"Messages from your client, always enabled",required:!0},{matches:".unsorted",becomes:"vc_unsorted",pretty:"Unsorted",tooltip:"Messages that don't have any filters.",required:!1,admin:!1}]},mounted:function(){this.load_settings();var e=new XMLHttpRequest;e.open("GET","ss13styles.css"),e.onreadystatechange=(function(){this.ext_styles=e.responseText}).bind(this),e.send()},updated:function(){this.editing||this.paused||window.scrollTo(0,document.getElementById("messagebox").scrollHeight)},watch:{reconnecting:function(e,t){!0==e&&!1==t?this.internal_message("Your client has lost connection to the server, or there is severe lag. Your client will reconnect if possible."):!1==e&&!0==t&&this.internal_message("Your client has reconnected to the server.")},inverted:function(e){set_storage("darkmode",e),e?(document.body.classList.add("inverted"),switch_ui_mode(DARKMODE_COLORS)):(document.body.classList.remove("inverted"),switch_ui_mode(LIGHTMODE_COLORS))},crushing:function(e){set_storage("crushing",e)},animated:function(e){set_storage("animated",e)},fontsize:function(e,t){if(isNaN(e)){this.fontsize=t;return}e<.2?this.fontsize=.2:e>5&&(this.fontsize=5),set_storage("fontsize",e)},lineheight:function(e,t){if(!isFinite(e)){this.lineheight=t;return}e<100?this.lineheight=100:e>200&&(this.lineheight=200),set_storage("lineheight",e)},showingnum:function(e,t){if(!isFinite(e)){this.showingnum=t;return}(e=Math.floor(e))<50?this.showingnum=50:e>2e3&&(this.showingnum=2e3),set_storage("showingnum",this.showingnum),push_Topic_showingnum(this.showingnum),this.attempt_archive()},current_categories:function(e,t){e.length&&this.apply_filter(e)}},computed:{active_tab:function(){return this.tabs.find(function(e){return e.active})},ping_classes:function(){return this.latency?"?"==this.latency?"grey":this.latency<0?"red":this.latency<=200?"green":this.latency<=400?"yellow":"grey":this.reconnecting?"red":"green"},current_categories:function(){return this.active_tab==this.tabs[0]?[]:this.active_tab.categories.concat(vchat_opts.alwaysShow)}},methods:{load_settings:function(){this.inverted=get_storage("darkmode",!1),this.crushing=get_storage("crushing",3),this.animated=get_storage("animated",!1),this.fontsize=get_storage("fontsize",.9),this.lineheight=get_storage("lineheight",130),this.showingnum=get_storage("showingnum",200),isNaN(this.crushing)&&(this.crushing=3),isNaN(this.fontsize)&&(this.fontsize=.9),this.load_tabs()},load_tabs:function(){var e=get_storage("tabs");if(e){var t=JSON.parse(e);if(!t.version||!t.tabs){this.internal_message("There was a problem loading your tabs. Any new ones you make will be saved, however.");return}if(!t.version==vchat_opts.vchatTabsVer){this.internal_message("Your saved tabs are for an older version of VChat and must be recreated, sorry.");return}this.tabs.push.apply(this.tabs,t.tabs)}},save_tabs:function(){var e={version:vchat_opts.vchatTabsVer,tabs:[]};this.tabs.forEach(function(t){if(!t.immutable){var s=t.name,a=[];t.categories.forEach(function(e){a.push(e)}),e.tabs.push({name:s,categories:a,immutable:!1,active:!1})}}),set_storage("tabs",JSON.stringify(e))},switchtab:function(e){e!=this.active_tab&&(this.active_tab.active=!1,e.active=!0,e.categories.forEach(function(e){this.unread_messages[e]=0},this),this.apply_filter(this.current_categories))},editmode:function(){this.editing=!this.editing,this.save_tabs()},pause:function(){this.paused=!this.paused},newtab:function(){this.tabs.push({name:"New Tab",categories:[],immutable:!1,active:!1}),this.switchtab(this.tabs[this.tabs.length-1])},renametab:function(){if(!this.active_tab.immutable){var e=this.active_tab,t=window.prompt("Type the desired tab name:",e.name);null!==t&&""!==t&&null!==e&&(e.name=t)}},deltab:function(e){e||(e=this.active_tab),!e.immutable&&(this.switchtab(this.tabs[0]),this.tabs.splice(this.tabs.indexOf(e),1))},movetab:function(e,t){if(e&&!e.immutable){var s=this.tabs.indexOf(e);this.tabs.splice(s+t,0,this.tabs.splice(s,1)[0])}},tab_unread_count:function(e){var t=0,s=this.unread_messages;return e.categories.find(function(e){s[e]&&(t+=s[e])}),t},tab_unread_categories:function(e){var t=!1,s=this.unread_messages;return e.categories.find(function(e){if(s[e])return t=!0,!0}),{red:t,grey:!t}},attempt_archive:function(){if(this.messages.length>this.showingnum){var e=this.messages.splice(0,20);Array.prototype.push.apply(this.archived_messages,e)}},apply_filter:function(e){this.shown_messages.splice(0),this.unshown_messages=0,this.messages.forEach(function(t){e.indexOf(t.category)>-1&&this.shown_messages.push(t)},this),this.archived_messages.forEach(function(t){e.indexOf(t.category)>-1&&this.unshown_messages++},this)},add_message:function(e){let t={time:e.time,category:"error",content:e.message,repeats:1};if(t.category=this.get_category(t.content),"vc_unsorted"==t.category&&(t.content=""+t.content+""),this.crushing){let s=this.messages.slice(-this.crushing);for(let a=s.length-1;a>=0;a--){let n=s[a];n.content==t.content&&(t.repeats+=n.repeats,this.messages.splice(this.messages.indexOf(n),1))}}t.content=t.content.replace(/(\b(https?):\/\/[\-A-Z0-9+&@#\/%?=~_|!:,.;]*[\-A-Z0-9+&@#\/%=~_|])/img,'$1'),this.current_categories.length&&0>this.current_categories.indexOf(t.category)?(isNaN(this.unread_messages[t.category])&&(this.unread_messages[t.category]=0),this.unread_messages[t.category]+=1):this.current_categories.length&&this.shown_messages.push(t),t.id=++vchat_state.lastId,this.attempt_archive(),this.messages.push(t)},internal_message:function(e){let t={time:this.messages.length?this.messages.slice(-1).time+1:0,category:"vc_system",content:"[VChat Internal] "+e+""};t.id=++vchat_state.lastId,this.messages.push(t)},on_mouseup:function(e){let t=e.target;"getSelection"in window&&!1===window.getSelection().isCollapsed||t&&("INPUT"===t.tagName||"TEXTAREA"===t.tagName)||(focusMapWindow(),e.preventDefault(),e.target.click())},click_message:function(e){let t=e.target;if("A"===t.tagName){e.stopPropagation(),e.preventDefault?e.preventDefault():e.returnValue=!1;var s=t.getAttribute("href");"?"==s[0]||s.length>=8&&"byond://"==s.substring(0,8)?window.location=s:window.location="byond://?action=openLink&link="+encodeURIComponent(s)}},get_category:function(e){if(!vchat_state.ready){push_Topic("not_ready");return}let t=domparser.parseFromString(e,"text/html").querySelector("span"),s="vc_unsorted";return t&&this.type_table.find(function(e){if(t.msMatchesSelector(e.matches))return s=e.becomes,!0}),s},save_chatlog:function(){var e="",t=this.archived_messages.concat(this.messages),s=this.current_categories;t.forEach(function(t){(0==s.length||s.indexOf(t.category)>=0)&&(e+=t.content,t.repeats>1&&(e+="(x"+t.repeats+")"),e+="
\n")}),e+="";var a=new Date,n=String(a.getHours());n.length<2&&(n="0"+n);var o=String(a.getMinutes());o.length<2&&(o="0"+o);var i=String(a.getDate());i.length<2&&(i="0"+i);var r=String(a.getMonth()+1);r.length<2&&(r="0"+r);var c="log"+(" "+String(a.getFullYear())+"-"+r+"-"+i+" ("+n+" "+o)+").html",l=document.createElement("a");if(void 0!==l.download)l.href="data:attachment/text,"+encodeURI(e),l.target="_blank",l.download=c,l.click();else{var h=new Blob([e],{type:"text/html;charset=utf8;"});saved=window.navigator.msSaveOrOpenBlob(h,c)}},do_latency_test:function(){send_latency_check()},blur_this:function(e){e.target.blur()}}})}function check_ping(){Date.now()-vchat_state.lastPingReceived>vchat_opts.msBeforeDropped&&(vueapp.reconnecting=!0)}function send_latency_check(){vchat_state.latency_sent||(vchat_state.latency_sent=Date.now(),vueapp.latency="?",push_Topic("ping"),setTimeout(function(){"?"==vchat_state.latency_ms&&(vchat_state.latency_ms=999)},1e3),setTimeout(function(){vchat_state.latency_sent=0,vueapp.latency=0},5e3))}function get_latency_check(){vchat_state.latency_sent&&(vueapp.latency=Date.now()-vchat_state.latency_sent)}function byondDecode(e){e=e.replace(/\+/g,"%20");try{e=decodeURIComponent(e)}catch(t){e=unescape(e)}return JSON.parse(e)}function putmessage(e){Array.isArray(e=byondDecode(e))?e.forEach(function(e){vueapp.add_message(e)}):"object"==typeof e&&vueapp.add_message(e)}function system_message(e){vueapp.internal_message(e)}function push_Topic(e){window.location="?_src_=chat&proc="+e}function push_Topic_showingnum(e){window.location="?_src_=chat&showingnum="+e}function focusMapWindow(){window.location="byond://winset?mapwindow.map.focus=true"}function send_debug(e){push_Topic("debug¶m[message]="+encodeURIComponent(e))}function get_event(e){if(!vchat_state.ready){push_Topic("not_ready");return}var t={evttype:"internal_error",event:e};switch((t=byondDecode(e)).evttype){case"internal_error":system_message("Event parse error: "+e);break;case"byond_player":send_client_data(),vueapp.is_admin="true"===t.admin,vchat_state.byond_ip=t.address,vchat_state.byond_cid=t.cid,vchat_state.byond_ckey=t.ckey,set_storage("ip",vchat_state.byond_ip),set_storage("cid",vchat_state.byond_cid),set_storage("ckey",vchat_state.byond_ckey);break;case"keepalive":vchat_state.lastPingReceived=Date.now(),vueapp.reconnecting=!1;break;case"pong":get_latency_check();break;case"availability":push_Topic("done_loading");break;default:system_message("Didn't know what to do with event: "+e)}}function send_client_data(){push_Topic("ident¶m[clientdata]="+JSON.stringify({ip:get_storage("ip"),cid:get_storage("cid"),ckey:get_storage("ckey")}))}function set_localstorage(e,t){window.localStorage.setItem(vchat_opts.cookiePrefix+e,t)}function get_localstorage(e,t){let s=window.localStorage.getItem(vchat_opts.cookiePrefix+e);return"null"===s||null===s?s=t:"true"===s?s=!0:"false"===s?s=!1:isNaN(s)||(s=+s),s}function set_cookie(e,t){let s=new Date;s.setFullYear(s.getFullYear()+1);let a=s.toUTCString();document.cookie=vchat_opts.cookiePrefix+e+"="+t+";expires="+a+";path=/"}function get_cookie(e,t){var s={cookie:null,localstorage:null,indexeddb:null};let a=document.cookie.split(";"),n={};a.forEach(function(e){let s=e.replace(vchat_opts.cookiePrefix,"").trim(),a=s.search("="),o=decodeURIComponent(s.substring(0,a)),i=decodeURIComponent(s.substring(a+1));"null"==i||null===i?i=t:"true"===i?i=!0:"false"===i?i=!1:isNaN(i)||(i=+i),n[o]=i}),s.cookie=n[e]}var SKIN_BUTTONS=["rpane.textb","rpane.infob","rpane.wikib","rpane.forumb","rpane.rulesb","rpane.github","rpane.discord","rpane.mapb","rpane.changelog","mainwindow.saybutton","mainwindow.mebutton","mainwindow.hotkey_toggle"],SKIN_ELEMENTS=["mainwindow","mainwindow.mainvsplit","mainwindow.tooltip","rpane","rpane.rpanewindow","rpane.mediapanel",];function switch_ui_mode(e){doWinset(SKIN_BUTTONS.reduce(function(t,s){return t[s+".background-color"]=e.buttonBgColor,t},{})),doWinset(SKIN_BUTTONS.reduce(function(t,s){return t[s+".text-color"]=e.buttonTextColor,t},{})),doWinset(SKIN_ELEMENTS.reduce(function(t,s){return t[s+".background-color"]=e.windowBgColor,t},{})),doWinset("infowindow",{"background-color":e.tabBackgroundColor,"text-color":e.tabTextColor}),doWinset("infowindow.info",{"background-color":e.tabBackgroundColor,"text-color":e.tabTextColor,"highlight-color":e.highlightColor,"tab-text-color":e.tabTextColor,"tab-background-color":e.tabBackgroundColor})}function doWinset(e,t){void 0===t&&(t=e,e=null);var s="byond://winset?";e&&(s+="id="+e+"&"),s+=Object.keys(t).map(function(e){return e+"="+encodeURIComponent(t[e])}).join("&"),window.location=s} -======= -!function(){var e=console.log;console.log=function(t){send_debug(t),e.apply(console,arguments)};var t=console.error;console.error=function(e){send_debug(e),t.apply(console,arguments)},window.onerror=function(e,t,s,a,n){var o="";return n&&n.stack&&(o=n.stack),send_debug(e+" ("+t+"@"+s+":"+a+") "+n+"|UA: "+navigator.userAgent+"|Stack: "+o),!0}}();var vueapp,vchat_opts={msBeforeDropped:3e4,cookiePrefix:"vst-",alwaysShow:["vc_looc","vc_system"],vchatTabsVer:1},DARKMODE_COLORS={buttonBgColor:"#40628a",buttonTextColor:"#FFFFFF",windowBgColor:"#272727",highlightColor:"#009900",tabTextColor:"#FFFFFF",tabBackgroundColor:"#272727"},LIGHTMODE_COLORS={buttonBgColor:"none",buttonTextColor:"#000000",windowBgColor:"none",highlightColor:"#007700",tabTextColor:"#000000",tabBackgroundColor:"none"},set_storage=set_cookie,get_storage=get_cookie,domparser=new DOMParser;storageAvailable("localStorage")&&(set_storage=set_localstorage,get_storage=get_localstorage);var vchat_state={ready:!1,byond_ip:null,byond_cid:null,byond_ckey:null,lastPingReceived:0,latency_sent:0,lastId:0};function start_vchat(){start_vue(),vchat_state.ready=!0,push_Topic("done_loading"),push_Topic_showingnum(this.showingnum),doWinset("htmloutput",{"is-visible":!0}),doWinset("oldoutput",{"is-visible":!1}),doWinset("chatloadlabel",{"is-visible":!1}),setInterval(check_ping,vchat_opts.msBeforeDropped),send_debug("VChat Loaded!")}function start_vue(){vueapp=new Vue({el:"#app",data:{messages:[],shown_messages:[],unshown_messages:0,archived_messages:[],tabs:[{name:"Main",categories:[],immutable:!0,active:!0}],unread_messages:{},editing:!1,paused:!1,latency:0,reconnecting:!1,ext_styles:"",is_admin:!1,inverted:!1,crushing:3,animated:!1,fontsize:.9,lineheight:130,showingnum:200,type_table:[{matches:".filter_say, .say, .emote, .emotesubtle",becomes:"vc_localchat",pretty:"Local Chat",tooltip:"In-character local messages (say, emote, etc)",required:!1,admin:!1},{matches:".filter_radio, .alert, .syndradio, .centradio, .airadio, .entradio, .comradio, .secradio, .engradio, .medradio, .sciradio, .supradio, .srvradio, .expradio, .radio, .deptradio, .newscaster",becomes:"vc_radio",pretty:"Radio Comms",tooltip:"All departments of radio messages",required:!1,admin:!1},{matches:".filter_notice, .notice:not(.pm), .adminnotice, .info, .sinister, .cult",becomes:"vc_info",pretty:"Notices",tooltip:"Non-urgent messages from the game and items",required:!1,admin:!1},{matches:".filter_warning, .warning:not(.pm), .critical, .userdanger, .italics",becomes:"vc_warnings",pretty:"Warnings",tooltip:"Urgent messages from the game and items",required:!1,admin:!1},{matches:".filter_deadsay, .deadsay",becomes:"vc_deadchat",pretty:"Deadchat",tooltip:"All of deadchat",required:!1,admin:!1},{matches:".filter_pray",becomes:"vc_pray",pretty:"Pray",tooltip:"Prayer messages",required:!1,admin:!1},{matches:".ooc, .filter_ooc",becomes:"vc_globalooc",pretty:"Global OOC",tooltip:"The bluewall of global OOC messages",required:!1,admin:!1},{matches:".nif",becomes:"vc_nif",pretty:"NIF Messages",tooltip:"Messages from the NIF itself and people inside",required:!1,admin:!1},{matches:".psay, .pemote",becomes:"vc_pmessage",pretty:"Pred/Prey Messages",tooltip:"Messages from / to absorbed or dominated prey",required:!1,admin:!1},{matches:".mentor_channel, .mentor",becomes:"vc_mentor",pretty:"Mentor messages",tooltip:"Mentorchat and mentor pms",required:!1,admin:!1},{matches:".filter_pm, .pm",becomes:"vc_adminpm",pretty:"Admin PMs",tooltip:"Messages to/from admins ('adminhelps')",required:!1,admin:!1},{matches:".filter_ASAY, .admin_channel",becomes:"vc_adminchat",pretty:"Admin Chat",tooltip:"ASAY messages",required:!1,admin:!0},{matches:".filter_MSAY, .mod_channel",becomes:"vc_modchat",pretty:"Mod Chat",tooltip:"MSAY messages",required:!1,admin:!0},{matches:".filter_ESAY, .event_channel",becomes:"vc_eventchat",pretty:"Event Chat",tooltip:"ESAY messages",required:!1,admin:!0},{matches:".filter_combat, .danger",becomes:"vc_combat",pretty:"Combat Logs",tooltip:"Urist McTraitor has stabbed you with a knife!",required:!1,admin:!1},{matches:".filter_adminlogs, .log_message",becomes:"vc_adminlogs",pretty:"Admin Logs",tooltip:"ADMIN LOG: Urist McAdmin has jumped to coordinates X, Y, Z",required:!1,admin:!0},{matches:".filter_attacklogs",becomes:"vc_attacklogs",pretty:"Attack Logs",tooltip:"Urist McTraitor has shot John Doe",required:!1,admin:!0},{matches:".filter_debuglogs",becomes:"vc_debuglogs",pretty:"Debug Logs",tooltip:"DEBUG: SSPlanets subsystem Recover().",required:!1,admin:!0},{matches:".looc",becomes:"vc_looc",pretty:"Local OOC",tooltip:"Local OOC messages, always enabled",required:!0},{matches:".rlooc",becomes:"vc_rlooc",pretty:"Remote LOOC",tooltip:"Remote LOOC messages",required:!1,admin:!0},{matches:".boldannounce, .filter_system",becomes:"vc_system",pretty:"System Messages",tooltip:"Messages from your client, always enabled",required:!0},{matches:".unsorted",becomes:"vc_unsorted",pretty:"Unsorted",tooltip:"Messages that don't have any filters.",required:!1,admin:!1}]},mounted:function(){this.load_settings();var e=new XMLHttpRequest;e.open("GET","ss13styles.css"),e.onreadystatechange=(function(){this.ext_styles=e.responseText}).bind(this),e.send()},updated:function(){this.editing||this.paused||window.scrollTo(0,document.getElementById("messagebox").scrollHeight)},watch:{reconnecting:function(e,t){!0==e&&!1==t?this.internal_message("Your client has lost connection to the server, or there is severe lag. Your client will reconnect if possible."):!1==e&&!0==t&&this.internal_message("Your client has reconnected to the server.")},inverted:function(e){set_storage("darkmode",e),e?(document.body.classList.add("inverted"),switch_ui_mode(DARKMODE_COLORS)):(document.body.classList.remove("inverted"),switch_ui_mode(LIGHTMODE_COLORS))},crushing:function(e){set_storage("crushing",e)},animated:function(e){set_storage("animated",e)},fontsize:function(e,t){if(isNaN(e)){this.fontsize=t;return}e<.2?this.fontsize=.2:e>5&&(this.fontsize=5),set_storage("fontsize",e)},lineheight:function(e,t){if(!isFinite(e)){this.lineheight=t;return}e<100?this.lineheight=100:e>200&&(this.lineheight=200),set_storage("lineheight",e)},showingnum:function(e,t){if(!isFinite(e)){this.showingnum=t;return}(e=Math.floor(e))<50?this.showingnum=50:e>2e3&&(this.showingnum=2e3),set_storage("showingnum",this.showingnum),push_Topic_showingnum(this.showingnum),this.attempt_archive()},current_categories:function(e,t){e.length&&this.apply_filter(e)}},computed:{active_tab:function(){return this.tabs.find(function(e){return e.active})},ping_classes:function(){return this.latency?"?"==this.latency?"grey":this.latency<0?"red":this.latency<=200?"green":this.latency<=400?"yellow":"grey":this.reconnecting?"red":"green"},current_categories:function(){return this.active_tab==this.tabs[0]?[]:this.active_tab.categories.concat(vchat_opts.alwaysShow)}},methods:{load_settings:function(){this.inverted=get_storage("darkmode",!1),this.crushing=get_storage("crushing",3),this.animated=get_storage("animated",!1),this.fontsize=get_storage("fontsize",.9),this.lineheight=get_storage("lineheight",130),this.showingnum=get_storage("showingnum",200),isNaN(this.crushing)&&(this.crushing=3),isNaN(this.fontsize)&&(this.fontsize=.9),this.load_tabs()},load_tabs:function(){var e=get_storage("tabs");if(e){var t=JSON.parse(e);if(!t.version||!t.tabs){this.internal_message("There was a problem loading your tabs. Any new ones you make will be saved, however.");return}if(!t.version==vchat_opts.vchatTabsVer){this.internal_message("Your saved tabs are for an older version of VChat and must be recreated, sorry.");return}this.tabs.push.apply(this.tabs,t.tabs)}},save_tabs:function(){var e={version:vchat_opts.vchatTabsVer,tabs:[]};this.tabs.forEach(function(t){if(!t.immutable){var s=t.name,a=[];t.categories.forEach(function(e){a.push(e)}),e.tabs.push({name:s,categories:a,immutable:!1,active:!1})}}),set_storage("tabs",JSON.stringify(e))},switchtab:function(e){e!=this.active_tab&&(this.active_tab.active=!1,e.active=!0,e.categories.forEach(function(e){this.unread_messages[e]=0},this),this.apply_filter(this.current_categories))},editmode:function(){this.editing=!this.editing,this.save_tabs()},pause:function(){this.paused=!this.paused},newtab:function(){this.tabs.push({name:"New Tab",categories:[],immutable:!1,active:!1}),this.switchtab(this.tabs[this.tabs.length-1])},renametab:function(){if(!this.active_tab.immutable){var e=this.active_tab,t=window.prompt("Type the desired tab name:",e.name);null!==t&&""!==t&&null!==e&&(e.name=t)}},deltab:function(e){e||(e=this.active_tab),!e.immutable&&(this.switchtab(this.tabs[0]),this.tabs.splice(this.tabs.indexOf(e),1))},movetab:function(e,t){if(e&&!e.immutable){var s=this.tabs.indexOf(e);this.tabs.splice(s+t,0,this.tabs.splice(s,1)[0])}},tab_unread_count:function(e){var t=0,s=this.unread_messages;return e.categories.find(function(e){s[e]&&(t+=s[e])}),t},tab_unread_categories:function(e){var t=!1,s=this.unread_messages;return e.categories.find(function(e){if(s[e])return t=!0,!0}),{red:t,grey:!t}},attempt_archive:function(){if(this.messages.length>this.showingnum){var e=this.messages.splice(0,20);Array.prototype.push.apply(this.archived_messages,e)}},apply_filter:function(e){this.shown_messages.splice(0),this.unshown_messages=0,this.messages.forEach(function(t){e.indexOf(t.category)>-1&&this.shown_messages.push(t)},this),this.archived_messages.forEach(function(t){e.indexOf(t.category)>-1&&this.unshown_messages++},this)},add_message:function(e){let t={time:e.time,category:"error",content:e.message,repeats:1};if(t.category=this.get_category(t.content),"vc_unsorted"==t.category&&(t.content=""+t.content+""),this.crushing){let s=this.messages.slice(-this.crushing);for(let a=s.length-1;a>=0;a--){let n=s[a];n.content==t.content&&(t.repeats+=n.repeats,this.messages.splice(this.messages.indexOf(n),1))}}t.content=t.content.replace(/(\b(https?):\/\/[\-A-Z0-9+&@#\/%?=~_|!:,.;]*[\-A-Z0-9+&@#\/%=~_|])/img,'$1'),this.current_categories.length&&0>this.current_categories.indexOf(t.category)?(isNaN(this.unread_messages[t.category])&&(this.unread_messages[t.category]=0),this.unread_messages[t.category]+=1):this.current_categories.length&&this.shown_messages.push(t),t.id=++vchat_state.lastId,this.attempt_archive(),this.messages.push(t)},internal_message:function(e){let t={time:this.messages.length?this.messages.slice(-1).time+1:0,category:"vc_system",content:"[VChat Internal] "+e+""};t.id=++vchat_state.lastId,this.messages.push(t)},on_mouseup:function(e){let t=e.target;"getSelection"in window&&!1===window.getSelection().isCollapsed||t&&("INPUT"===t.tagName||"TEXTAREA"===t.tagName)||(focusMapWindow(),e.preventDefault(),e.target.click())},click_message:function(e){let t=e.target;if("A"===t.tagName){e.stopPropagation(),e.preventDefault?e.preventDefault():e.returnValue=!1;var s=t.getAttribute("href");"?"==s[0]||s.length>=8&&"byond://"==s.substring(0,8)?window.location=s:window.location="byond://?action=openLink&link="+encodeURIComponent(s)}},get_category:function(e){if(!vchat_state.ready){push_Topic("not_ready");return}let t=domparser.parseFromString(e,"text/html").querySelector("span"),s="vc_unsorted";return t&&this.type_table.find(function(e){if(t.msMatchesSelector(e.matches))return s=e.becomes,!0}),s},save_chatlog:function(){var e="",t=this.archived_messages.concat(this.messages),s=this.current_categories;t.forEach(function(t){(0==s.length||s.indexOf(t.category)>=0)&&(e+=t.content,t.repeats>1&&(e+="(x"+t.repeats+")"),e+="
\n")}),e+="";var a=new Date,n=String(a.getHours());n.length<2&&(n="0"+n);var o=String(a.getMinutes());o.length<2&&(o="0"+o);var i=String(a.getDate());i.length<2&&(i="0"+i);var r=String(a.getMonth()+1);r.length<2&&(r="0"+r);var c="log"+(" "+String(a.getFullYear())+"-"+r+"-"+i+" ("+n+" "+o)+").html",l=document.createElement("a");if(void 0!==l.download)l.href="data:attachment/text,"+encodeURI(e),l.target="_blank",l.download=c,l.click();else{var h=new Blob([e],{type:"text/html;charset=utf8;"});saved=window.navigator.msSaveOrOpenBlob(h,c)}},do_latency_test:function(){send_latency_check()},blur_this:function(e){e.target.blur()}}})}function check_ping(){Date.now()-vchat_state.lastPingReceived>vchat_opts.msBeforeDropped&&(vueapp.reconnecting=!0)}function send_latency_check(){vchat_state.latency_sent||(vchat_state.latency_sent=Date.now(),vueapp.latency="?",push_Topic("ping"),setTimeout(function(){"?"==vchat_state.latency_ms&&(vchat_state.latency_ms=999)},1e3),setTimeout(function(){vchat_state.latency_sent=0,vueapp.latency=0},5e3))}function get_latency_check(){vchat_state.latency_sent&&(vueapp.latency=Date.now()-vchat_state.latency_sent)}function byondDecode(e){e=e.replace(/\+/g,"%20");try{e=decodeURIComponent(e)}catch(t){e=unescape(e)}return JSON.parse(e)}function putmessage(e){Array.isArray(e=byondDecode(e))?e.forEach(function(e){vueapp.add_message(e)}):"object"==typeof e&&vueapp.add_message(e)}function system_message(e){vueapp.internal_message(e)}function push_Topic(e){window.location="?_src_=chat&proc="+e}function push_Topic_showingnum(e){window.location="?_src_=chat&showingnum="+e}function focusMapWindow(){window.location="byond://winset?mapwindow.map.focus=true"}function send_debug(e){push_Topic("debug¶m[message]="+encodeURIComponent(e))}function get_event(e){if(!vchat_state.ready){push_Topic("not_ready");return}var t={evttype:"internal_error",event:e};switch((t=byondDecode(e)).evttype){case"internal_error":system_message("Event parse error: "+e);break;case"byond_player":send_client_data(),vueapp.is_admin="true"===t.admin,vchat_state.byond_ip=t.address,vchat_state.byond_cid=t.cid,vchat_state.byond_ckey=t.ckey,set_storage("ip",vchat_state.byond_ip),set_storage("cid",vchat_state.byond_cid),set_storage("ckey",vchat_state.byond_ckey);break;case"keepalive":vchat_state.lastPingReceived=Date.now(),vueapp.reconnecting=!1;break;case"pong":get_latency_check();break;case"availability":push_Topic("done_loading");break;default:system_message("Didn't know what to do with event: "+e)}}function send_client_data(){push_Topic("ident¶m[clientdata]="+JSON.stringify({ip:get_storage("ip"),cid:get_storage("cid"),ckey:get_storage("ckey")}))}function set_localstorage(e,t){window.localStorage.setItem(vchat_opts.cookiePrefix+e,t)}function get_localstorage(e,t){let s=window.localStorage.getItem(vchat_opts.cookiePrefix+e);return"null"===s||null===s?s=t:"true"===s?s=!0:"false"===s?s=!1:isNaN(s)||(s=+s),s}function set_cookie(e,t){let s=new Date;s.setFullYear(s.getFullYear()+1);let a=s.toUTCString();document.cookie=vchat_opts.cookiePrefix+e+"="+t+";expires="+a+";path=/"}function get_cookie(e,t){var s={cookie:null,localstorage:null,indexeddb:null};let a=document.cookie.split(";"),n={};a.forEach(function(e){let s=e.replace(vchat_opts.cookiePrefix,"").trim(),a=s.search("="),o=decodeURIComponent(s.substring(0,a)),i=decodeURIComponent(s.substring(a+1));"null"==i||null===i?i=t:"true"===i?i=!0:"false"===i?i=!1:isNaN(i)||(i=+i),n[o]=i}),s.cookie=n[e]}var SKIN_BUTTONS=["rpane.textb","rpane.infob","rpane.wikib","rpane.forumb","rpane.rulesb","rpane.github","rpane.discord","rpane.mapb","rpane.changelog","mainwindow.saybutton","mainwindow.mebutton","mainwindow.hotkey_toggle"],SKIN_ELEMENTS=["mainwindow","mainwindow.mainvsplit","mainwindow.tooltip","rpane","rpane.rpanewindow","rpane.mediapanel",];function switch_ui_mode(e){doWinset(SKIN_BUTTONS.reduce(function(t,s){return t[s+".background-color"]=e.buttonBgColor,t},{})),doWinset(SKIN_BUTTONS.reduce(function(t,s){return t[s+".text-color"]=e.buttonTextColor,t},{})),doWinset(SKIN_ELEMENTS.reduce(function(t,s){return t[s+".background-color"]=e.windowBgColor,t},{})),doWinset("infowindow",{"background-color":e.tabBackgroundColor,"text-color":e.tabTextColor}),doWinset("infowindow.info",{"background-color":e.tabBackgroundColor,"text-color":e.tabTextColor,"highlight-color":e.highlightColor,"tab-text-color":e.tabTextColor,"tab-background-color":e.tabBackgroundColor})}function doWinset(e,t){void 0===t&&(t=e,e=null);var s="byond://winset?";e&&(s+="id="+e+"&"),s+=Object.keys(t).map(function(e){return e+"="+encodeURIComponent(t[e])}).join("&"),window.location=s} ->>>>>>> 097d78a0e0... Merge pull request #14625 from ItsSelis/selis-tgchat +!function(){var e=console.log;console.log=function(t){send_debug(t),e.apply(console,arguments)};var t=console.error;console.error=function(e){send_debug(e),t.apply(console,arguments)},window.onerror=function(e,t,s,a,o){var n="";return o&&o.stack&&(n=o.stack),send_debug(e+" ("+t+"@"+s+":"+a+") "+o+"|UA: "+navigator.userAgent+"|Stack: "+n),!0}}();var vchat_opts={msBeforeDropped:3e4,cookiePrefix:"vst-",alwaysShow:["vc_adminpm","vc_system"],vchatTabsVer:1},DARKMODE_COLORS={buttonBgColor:"#40628a",buttonTextColor:"#FFFFFF",windowBgColor:"#272727",highlightColor:"#009900",tabTextColor:"#FFFFFF",tabBackgroundColor:"#272727"},LIGHTMODE_COLORS={buttonBgColor:"none",buttonTextColor:"#000000",windowBgColor:"none",highlightColor:"#007700",tabTextColor:"#000000",tabBackgroundColor:"none"},set_storage=set_cookie,get_storage=get_cookie,domparser=new DOMParser;storageAvailable("localStorage")&&(set_storage=set_localstorage,get_storage=get_localstorage);var vueapp,vchat_state={ready:!1,byond_ip:null,byond_cid:null,byond_ckey:null,lastPingReceived:0,latency_sent:0,lastId:0};function start_vchat(){start_vue(),vchat_state.ready=!0,push_Topic("done_loading"),push_Topic_showingnum(this.showingnum),doWinset("htmloutput",{"is-visible":!0}),doWinset("oldoutput",{"is-visible":!1}),doWinset("chatloadlabel",{"is-visible":!1}),setInterval(check_ping,vchat_opts.msBeforeDropped),send_debug("VChat Loaded!")}function start_vue(){vueapp=new Vue({el:"#app",data:{messages:[],shown_messages:[],unshown_messages:0,archived_messages:[],tabs:[{name:"Main",categories:[],immutable:!0,active:!0}],unread_messages:{},editing:!1,paused:!1,latency:0,reconnecting:!1,ext_styles:"",is_admin:!1,inverted:!1,crushing:3,animated:!1,fontsize:.9,lineheight:130,showingnum:200,type_table:[{matches:".filter_say, .say, .emote, .emotesubtle",becomes:"vc_localchat",pretty:"Local Chat",tooltip:"In-character local messages (say, emote, etc)",required:!1,admin:!1},{matches:".filter_radio, .alert, .syndradio, .centradio, .airadio, .entradio, .comradio, .secradio, .engradio, .medradio, .sciradio, .supradio, .srvradio, .expradio, .radio, .deptradio, .newscaster",becomes:"vc_radio",pretty:"Radio Comms",tooltip:"All departments of radio messages",required:!1,admin:!1},{matches:".filter_notice, .notice:not(.pm), .adminnotice, .info, .sinister, .cult",becomes:"vc_info",pretty:"Notices",tooltip:"Non-urgent messages from the game and items",required:!1,admin:!1},{matches:".filter_warning, .warning:not(.pm), .critical, .userdanger, .italics",becomes:"vc_warnings",pretty:"Warnings",tooltip:"Urgent messages from the game and items",required:!1,admin:!1},{matches:".valert, .vwarning, .vnotice, .vdanger",becomes:"vc_vore_message",pretty:"Vore Messages",tooltip:"Vore Messages",required:!1,admin:!1},{matches:".filter_deadsay, .deadsay",becomes:"vc_deadchat",pretty:"Deadchat",tooltip:"All of deadchat",required:!1,admin:!1},{matches:".filter_pray",becomes:"vc_pray",pretty:"Pray",tooltip:"Prayer messages",required:!1,admin:!1},{matches:".ooc, .filter_ooc",becomes:"vc_globalooc",pretty:"Global OOC",tooltip:"The bluewall of global OOC messages",required:!1,admin:!1},{matches:".nif",becomes:"vc_nif",pretty:"NIF Messages",tooltip:"Messages from the NIF itself and people inside",required:!1,admin:!1},{matches:".psay, .pemote",becomes:"vc_pmessage",pretty:"Pred/Prey Messages",tooltip:"Messages from / to absorbed or dominated prey",required:!1,admin:!1},{matches:".mentor_channel, .mentor",becomes:"vc_mentor",pretty:"Mentor messages",tooltip:"Mentorchat and mentor pms",required:!1,admin:!1},{matches:".filter_pm, .pm",becomes:"vc_adminpm",pretty:"Admin PMs",tooltip:"Messages to/from admins ('adminhelps'), always enabled",required:!0,admin:!1},{matches:".filter_ASAY, .admin_channel",becomes:"vc_adminchat",pretty:"Admin Chat",tooltip:"ASAY messages",required:!1,admin:!0},{matches:".filter_MSAY, .mod_channel",becomes:"vc_modchat",pretty:"Mod Chat",tooltip:"MSAY messages",required:!1,admin:!0},{matches:".filter_ESAY, .event_channel",becomes:"vc_eventchat",pretty:"Event Chat",tooltip:"ESAY messages",required:!1,admin:!0},{matches:".filter_combat, .danger",becomes:"vc_combat",pretty:"Combat Logs",tooltip:"Urist McTraitor has stabbed you with a knife!",required:!1,admin:!1},{matches:".filter_adminlogs, .log_message",becomes:"vc_adminlogs",pretty:"Admin Logs",tooltip:"ADMIN LOG: Urist McAdmin has jumped to coordinates X, Y, Z",required:!1,admin:!0},{matches:".filter_attacklogs",becomes:"vc_attacklogs",pretty:"Attack Logs",tooltip:"Urist McTraitor has shot John Doe",required:!1,admin:!0},{matches:".filter_debuglogs",becomes:"vc_debuglogs",pretty:"Debug Logs",tooltip:"DEBUG: SSPlanets subsystem Recover().",required:!1,admin:!0},{matches:".looc",becomes:"vc_looc",pretty:"Local OOC",tooltip:"Local OOC messages",required:!1},{matches:".rlooc",becomes:"vc_rlooc",pretty:"Remote LOOC",tooltip:"Remote LOOC messages",required:!1,admin:!0},{matches:".boldannounce, .filter_system",becomes:"vc_system",pretty:"System Messages",tooltip:"Messages from your client, always enabled",required:!0},{matches:".unsorted",becomes:"vc_unsorted",pretty:"Unsorted",tooltip:"Messages that don't have any filters.",required:!1,admin:!1}]},mounted:function(){this.load_settings();var e=new XMLHttpRequest;e.open("GET","ss13styles.css"),e.onreadystatechange=function(){this.ext_styles=e.responseText}.bind(this),e.send()},updated:function(){this.editing||this.paused||window.scrollTo(0,document.getElementById("messagebox").scrollHeight)},watch:{reconnecting:function(e,t){1==e&&0==t?this.internal_message("Your client has lost connection to the server, or there is severe lag. Your client will reconnect if possible."):0==e&&1==t&&this.internal_message("Your client has reconnected to the server.")},inverted:function(e){set_storage("darkmode",e),e?(document.body.classList.add("inverted"),switch_ui_mode(DARKMODE_COLORS)):(document.body.classList.remove("inverted"),switch_ui_mode(LIGHTMODE_COLORS))},crushing:function(e){set_storage("crushing",e)},animated:function(e){set_storage("animated",e)},fontsize:function(e,t){isNaN(e)?this.fontsize=t:(e<.2?this.fontsize=.2:e>5&&(this.fontsize=5),set_storage("fontsize",e))},lineheight:function(e,t){isFinite(e)?(e<100?this.lineheight=100:e>200&&(this.lineheight=200),set_storage("lineheight",e)):this.lineheight=t},showingnum:function(e,t){isFinite(e)?((e=Math.floor(e))<50?this.showingnum=50:e>2e3&&(this.showingnum=2e3),set_storage("showingnum",this.showingnum),push_Topic_showingnum(this.showingnum),this.attempt_archive()):this.showingnum=t},current_categories:function(e,t){e.length&&this.apply_filter(e)}},computed:{active_tab:function(){return this.tabs.find((function(e){return e.active}))},ping_classes:function(){return this.latency?"?"==this.latency?"grey":this.latency<0?"red":this.latency<=200?"green":this.latency<=400?"yellow":"grey":this.reconnecting?"red":"green"},current_categories:function(){return this.active_tab==this.tabs[0]?[]:this.active_tab.categories.concat(vchat_opts.alwaysShow)}},methods:{load_settings:function(){this.inverted=get_storage("darkmode",!1),this.crushing=get_storage("crushing",3),this.animated=get_storage("animated",!1),this.fontsize=get_storage("fontsize",.9),this.lineheight=get_storage("lineheight",130),this.showingnum=get_storage("showingnum",200),isNaN(this.crushing)&&(this.crushing=3),isNaN(this.fontsize)&&(this.fontsize=.9),this.load_tabs()},load_tabs:function(){var e=get_storage("tabs");if(e){var t=JSON.parse(e);t.version&&t.tabs?!t.version!=vchat_opts.vchatTabsVer?this.tabs.push.apply(this.tabs,t.tabs):this.internal_message("Your saved tabs are for an older version of VChat and must be recreated, sorry."):this.internal_message("There was a problem loading your tabs. Any new ones you make will be saved, however.")}},save_tabs:function(){var e={version:vchat_opts.vchatTabsVer,tabs:[]};this.tabs.forEach((function(t){if(!t.immutable){var s=t.name,a=[];t.categories.forEach((function(e){a.push(e)}));var o={name:s,categories:a,immutable:!1,active:!1};e.tabs.push(o)}}));var t=JSON.stringify(e);set_storage("tabs",t)},switchtab:function(e){e!=this.active_tab&&(this.active_tab.active=!1,e.active=!0,e.categories.forEach((function(e){this.unread_messages[e]=0}),this),this.apply_filter(this.current_categories))},editmode:function(){this.editing=!this.editing,this.save_tabs()},pause:function(){this.paused=!this.paused},newtab:function(){this.tabs.push({name:"New Tab",categories:[],immutable:!1,active:!1}),this.switchtab(this.tabs[this.tabs.length-1])},renametab:function(){if(!this.active_tab.immutable){var e=this.active_tab,t=window.prompt("Type the desired tab name:",e.name);null!==t&&""!==t&&null!==e&&(e.name=t)}},deltab:function(e){e||(e=this.active_tab),e.immutable||(this.switchtab(this.tabs[0]),this.tabs.splice(this.tabs.indexOf(e),1))},movetab:function(e,t){if(e&&!e.immutable){var s=this.tabs.indexOf(e),a=s+t;this.tabs.splice(a,0,this.tabs.splice(s,1)[0])}},tab_unread_count:function(e){var t=0,s=this.unread_messages;return e.categories.find((function(e){s[e]&&(t+=s[e])})),t},tab_unread_categories:function(e){var t=!1,s=this.unread_messages;return e.categories.find((function(e){if(s[e])return t=!0,!0})),{red:t,grey:!t}},attempt_archive:function(){if(this.messages.length>this.showingnum){var e=this.messages.splice(0,20);Array.prototype.push.apply(this.archived_messages,e)}},apply_filter:function(e){this.shown_messages.splice(0),this.unshown_messages=0,this.messages.forEach((function(t){e.indexOf(t.category)>-1&&this.shown_messages.push(t)}),this),this.archived_messages.forEach((function(t){e.indexOf(t.category)>-1&&this.unshown_messages++}),this)},add_message:function(e){let t={time:e.time,category:"error",content:e.message,repeats:1};if(t.category=this.get_category(t.content),"vc_unsorted"==t.category&&(t.content=""+t.content+""),this.crushing){let e=this.messages.slice(-this.crushing);for(let s=e.length-1;s>=0;s--){let a=e[s];a.content==t.content&&(t.repeats+=a.repeats,this.messages.splice(this.messages.indexOf(a),1))}}t.content=t.content.replace(/(\b(https?):\/\/[\-A-Z0-9+&@#\/%?=~_|!:,.;]*[\-A-Z0-9+&@#\/%=~_|])/gim,'$1'),this.current_categories.length&&this.current_categories.indexOf(t.category)<0?(isNaN(this.unread_messages[t.category])&&(this.unread_messages[t.category]=0),this.unread_messages[t.category]+=1):this.current_categories.length&&this.shown_messages.push(t),t.id=++vchat_state.lastId,this.attempt_archive(),this.messages.push(t)},internal_message:function(e){let t={time:this.messages.length?this.messages.slice(-1).time+1:0,category:"vc_system",content:"[VChat Internal] "+e+""};t.id=++vchat_state.lastId,this.messages.push(t)},on_mouseup:function(e){let t=e.target;"getSelection"in window&&!1===window.getSelection().isCollapsed||t&&("INPUT"===t.tagName||"TEXTAREA"===t.tagName)||(focusMapWindow(),e.preventDefault(),e.target.click())},click_message:function(e){let t=e.target;if("A"===t.tagName){e.stopPropagation(),e.preventDefault?e.preventDefault():e.returnValue=!1;var s=t.getAttribute("href");"?"==s[0]||s.length>=8&&"byond://"==s.substring(0,8)?window.location=s:window.location="byond://?action=openLink&link="+encodeURIComponent(s)}},get_category:function(e){if(!vchat_state.ready)return void push_Topic("not_ready");let t=domparser.parseFromString(e,"text/html").querySelector("span"),s="vc_unsorted";return t?(this.type_table.find((function(e){if(t.msMatchesSelector(e.matches))return s=e.becomes,!0})),s):s},save_chatlog:function(){var e="",t=this.archived_messages.concat(this.messages),s=this.current_categories;t.forEach((function(t){(0==s.length||s.indexOf(t.category)>=0)&&(e+=t.content,t.repeats>1&&(e+="(x"+t.repeats+")"),e+="
\n")})),e+="";var a=new Date,o=String(a.getHours());o.length<2&&(o="0"+o);var n=String(a.getMinutes());n.length<2&&(n="0"+n);var i=String(a.getDate());i.length<2&&(i="0"+i);var r=String(a.getMonth()+1);r.length<2&&(r="0"+r);var c="log"+(" "+String(a.getFullYear())+"-"+r+"-"+i+" ("+o+" "+n+")")+".html",l=document.createElement("a");if(void 0!==l.download)l.href="data:attachment/text,"+encodeURI(e),l.target="_blank",l.download=c,l.click();else{var d=new Blob([e],{type:"text/html;charset=utf8;"});saved=window.navigator.msSaveOrOpenBlob(d,c)}},do_latency_test:function(){send_latency_check()},blur_this:function(e){e.target.blur()}}})}function check_ping(){Date.now()-vchat_state.lastPingReceived>vchat_opts.msBeforeDropped&&(vueapp.reconnecting=!0)}function send_latency_check(){vchat_state.latency_sent||(vchat_state.latency_sent=Date.now(),vueapp.latency="?",push_Topic("ping"),setTimeout((function(){"?"==vchat_state.latency_ms&&(vchat_state.latency_ms=999)}),1e3),setTimeout((function(){vchat_state.latency_sent=0,vueapp.latency=0}),5e3))}function get_latency_check(){vchat_state.latency_sent&&(vueapp.latency=Date.now()-vchat_state.latency_sent)}function byondDecode(e){e=e.replace(/\+/g,"%20");try{e=decodeURIComponent(e)}catch(t){e=unescape(e)}return JSON.parse(e)}function putmessage(e){e=byondDecode(e),Array.isArray(e)?e.forEach((function(e){vueapp.add_message(e)})):"object"==typeof e&&vueapp.add_message(e)}function system_message(e){vueapp.internal_message(e)}function push_Topic(e){window.location="?_src_=chat&proc="+e}function push_Topic_showingnum(e){window.location="?_src_=chat&showingnum="+e}function focusMapWindow(){window.location="byond://winset?mapwindow.map.focus=true"}function send_debug(e){push_Topic("debug¶m[message]="+encodeURIComponent(e))}function get_event(e){if(vchat_state.ready){var t;switch((t=byondDecode(e)).evttype){case"internal_error":system_message("Event parse error: "+e);break;case"byond_player":send_client_data(),vueapp.is_admin="true"===t.admin,vchat_state.byond_ip=t.address,vchat_state.byond_cid=t.cid,vchat_state.byond_ckey=t.ckey,set_storage("ip",vchat_state.byond_ip),set_storage("cid",vchat_state.byond_cid),set_storage("ckey",vchat_state.byond_ckey);break;case"keepalive":vchat_state.lastPingReceived=Date.now(),vueapp.reconnecting=!1;break;case"pong":get_latency_check();break;case"availability":push_Topic("done_loading");break;default:system_message("Didn't know what to do with event: "+e)}}else push_Topic("not_ready")}function send_client_data(){let e={ip:get_storage("ip"),cid:get_storage("cid"),ckey:get_storage("ckey")};push_Topic("ident¶m[clientdata]="+JSON.stringify(e))}function set_localstorage(e,t){window.localStorage.setItem(vchat_opts.cookiePrefix+e,t)}function get_localstorage(e,t){let s=window.localStorage.getItem(vchat_opts.cookiePrefix+e);return"null"===s||null===s?s=t:"true"===s?s=!0:"false"===s?s=!1:isNaN(s)||(s=+s),s}function set_cookie(e,t){let s=new Date;s.setFullYear(s.getFullYear()+1);let a=s.toUTCString();document.cookie=vchat_opts.cookiePrefix+e+"="+t+";expires="+a+";path=/"}function get_cookie(e,t){let s=document.cookie.split(";"),a={};s.forEach((function(e){let s=e.replace(vchat_opts.cookiePrefix,"").trim(),o=s.search("="),n=decodeURIComponent(s.substring(0,o)),i=decodeURIComponent(s.substring(o+1));"null"==i||null===i?i=t:"true"===i?i=!0:"false"===i?i=!1:isNaN(i)||(i=+i),a[n]=i})),a[e]}var SKIN_BUTTONS=["rpane.textb","rpane.infob","rpane.wikib","rpane.forumb","rpane.rulesb","rpane.github","rpane.discord","rpane.mapb","rpane.changelog","mainwindow.saybutton","mainwindow.mebutton","mainwindow.hotkey_toggle"],SKIN_ELEMENTS=["mainwindow","mainwindow.mainvsplit","mainwindow.tooltip","rpane","rpane.rpanewindow","rpane.mediapanel"];function switch_ui_mode(e){doWinset(SKIN_BUTTONS.reduce((function(t,s){return t[s+".background-color"]=e.buttonBgColor,t}),{})),doWinset(SKIN_BUTTONS.reduce((function(t,s){return t[s+".text-color"]=e.buttonTextColor,t}),{})),doWinset(SKIN_ELEMENTS.reduce((function(t,s){return t[s+".background-color"]=e.windowBgColor,t}),{})),doWinset("infowindow",{"background-color":e.tabBackgroundColor,"text-color":e.tabTextColor}),doWinset("infowindow.info",{"background-color":e.tabBackgroundColor,"text-color":e.tabTextColor,"highlight-color":e.highlightColor,"tab-text-color":e.tabTextColor,"tab-background-color":e.tabBackgroundColor})}function doWinset(e,t){void 0===t&&(t=e,e=null);var s="byond://winset?";e&&(s+="id="+e+"&"),s+=Object.keys(t).map((function(e){return e+"="+encodeURIComponent(t[e])})).join("&"),window.location=s} diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 74fc9bac4c..f7f9baef4b 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -133,6 +133,81 @@ "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.", @@ -220,6 +295,7 @@ "digestchance", "absorbchance", "escapechance", + "escapechance_absorbed", "transferchance", "transferchance_secondary", "transferlocation", @@ -231,6 +307,31 @@ "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", @@ -263,6 +364,7 @@ "belly_fullscreen_color4", "belly_fullscreen_alpha", "colorization_enabled", + "show_liquids", "reagentbellymode", "liquid_fullness1_messages", "liquid_fullness2_messages", @@ -406,7 +508,7 @@ formatted_desc = replacetext(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", thing) //replace with whatever mob entered into this belly - to_chat(thing, "[formatted_desc]") + to_chat(thing, "[formatted_desc]") return if(OldLoc in contents) return //Someone dropping something (or being stripdigested) @@ -416,7 +518,7 @@ //Generic entered message if(!owner.mute_entry && entrance_logs) //CHOMPEdit - to_chat(owner,"[thing] slides into your [lowertext(name)].") + to_chat(owner,"[thing] slides into your [lowertext(name)].") //Sound w/ antispam flag setting if(vore_sound && !recent_sound) @@ -450,11 +552,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, "[formatted_desc]") + to_chat(M, "[formatted_desc]") var/taste if(can_taste && (taste = M.get_taste_message(FALSE))) - to_chat(owner, "[M] tastes of [taste].") + to_chat(owner, "[M] tastes of [taste].") vore_fx(M, TRUE) //CHOMPEdit: update belleh if(owner.previewing_belly == src) //CHOMPEdit vore_fx(owner, TRUE) //CHOMPEdit: update belleh @@ -465,7 +567,7 @@ if(reagents.total_volume >= 5 && M.digestable) //CHOMPEdit Start if(digest_mode == DM_DIGEST) reagents.trans_to(M, reagents.total_volume * 0.1, 1 / max(LAZYLEN(contents), 1), FALSE) - to_chat(M, "You splash into a pool of [reagent_name]!") + to_chat(M, "You splash into a pool of [reagent_name]!") else if(count_items_for_sprite) //CHOMPEdit - If this is enabled also update fullness for non-living things owner.update_fullness() //CHOMPEdit - This is run whenever a belly's contents are changed. //if(istype(thing, /obj/item/capture_crystal)) //CHOMPEdit start: Capture crystal occupant gets to see belly text too. Moved to modular_chomp capture_crystal.dm. @@ -700,7 +802,7 @@ if(disable_hud && L != owner) if(L?.hud_used?.hud_shown) - to_chat(L, "((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.))") + to_chat(L, "((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.))") L.toggle_hud_vis(TRUE) /obj/belly/proc/vore_preview(mob/living/L) @@ -1065,7 +1167,7 @@ formatted_message = replacetext(formatted_message, "%countprey", living_count) formatted_message = replacetext(formatted_message, "%count", contents.len) - return("[formatted_message]") + return("[formatted_message]") /obj/belly/proc/get_examine_msg_absorbed() if(!(contents.len) || !(examine_messages_absorbed.len) || !display_absorbed_examine) @@ -1089,13 +1191,13 @@ formatted_message = replacetext(formatted_message, "%prey", english_list(absorbed_victims)) formatted_message = replacetext(formatted_message, "%countprey", absorbed_count) - return("[formatted_message]") + return("[formatted_message]") // 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 == "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 == "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") var/list/raw_messages switch(type) @@ -1107,6 +1209,56 @@ 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") @@ -1154,7 +1306,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 == "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 == "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") var/list/raw_list = splittext(html_encode(raw_text),delim) if(raw_list.len > 10) @@ -1187,6 +1339,56 @@ 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") @@ -1368,8 +1570,8 @@ GLOB.prey_absorbed_roundstat++ - to_chat(M, "[absorb_alert_prey]") - to_chat(owner, "[absorb_alert_owner]") + to_chat(M, "[absorb_alert_prey]") + to_chat(owner, "[absorb_alert_owner]") if(M.noisy) //Mute drained absorbee hunger if enabled. M.noisy = FALSE @@ -1411,7 +1613,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, "[formatted_abs_desc]") + to_chat(M, "[formatted_abs_desc]") //Update owner owner.updateVRPanel() @@ -1442,11 +1644,11 @@ M.absorbed = FALSE handle_absorb_langs(M, owner) - to_chat(M, "[unabsorb_alert_prey]") - to_chat(owner, "[unabsorb_alert_owner]") + to_chat(M, "[unabsorb_alert_prey]") + to_chat(owner, "[unabsorb_alert_owner]") if(desc) - to_chat(M, "[desc]") + to_chat(M, "[desc]") //Update owner owner.updateVRPanel() @@ -1504,9 +1706,48 @@ 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 = "[escape_attempt_owner_message]" + escape_attempt_prey_message = "[escape_attempt_prey_message]" + escape_fail_owner_message = "[escape_fail_owner_message]" + escape_fail_prey_message = "[escape_fail_prey_message]" + if(owner.stat) //If owner is stat (dead, KO) we can actually escape - to_chat(R, "You attempt to climb out of \the [lowertext(name)]. (This will take around [escapetime/10] seconds.)") - to_chat(owner, "Someone is attempting to climb out of your [lowertext(name)]!") + escape_attempt_prey_message = replacetext(escape_attempt_prey_message, new/regex("^(]*)?>.*)()$", ""), "$1 (This will take around [escapetime/10] seconds.)$2") + to_chat(R, escape_attempt_prey_message) + to_chat(owner, escape_attempt_owner_message) if(do_after(R, escapetime, owner, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED)) if((owner.stat || escapable)) //Can still escape? @@ -1519,17 +1760,13 @@ else if(R.loc != src) //Aren't even in the belly. Quietly fail. return else //Belly became inescapable or mob revived - to_chat(R,"Your attempt to escape [lowertext(name)] has failed!") - to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!") + to_chat(R, escape_fail_prey_message) + to_chat(owner, escape_fail_owner_message) 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)) @@ -1542,8 +1779,8 @@ struggle_user_message = replacetext(struggle_user_message, "%countprey", living_count) struggle_user_message = replacetext(struggle_user_message, "%count", contents.len) - struggle_outer_message = "[struggle_outer_message]" - struggle_user_message = "[struggle_user_message]" + struggle_outer_message = "[struggle_outer_message]" + struggle_user_message = "[struggle_user_message]" for(var/mob/M in hearers(4, owner)) M.show_message(struggle_outer_message, 2) // hearable @@ -1567,28 +1804,82 @@ 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, "You start to climb out of \the [lowertext(name)].") - to_chat(owner, "Someone is attempting to climb out of your [lowertext(name)]!") + to_chat(R, escape_attempt_prey_message) + to_chat(owner, escape_attempt_owner_message) 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 = "[escape_item_owner_message]" + escape_item_prey_message = "[escape_item_prey_message]" + escape_item_outside_message = "[escape_item_outside_message]" + release_specific_contents(C) - to_chat(R,"Your struggles successfully cause [owner] to squeeze your container out of their \the [lowertext(name)].") - to_chat(owner,"[C] suddenly slips out of your [lowertext(name)]!") + to_chat(R, escape_item_prey_message) + to_chat(owner, escape_item_owner_message) for(var/mob/M in hearers(4, owner)) - M.show_message("[C] suddenly slips out of [owner]'s [lowertext(name)]!", 2) + M.show_message(escape_item_outside_message, 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 = "[escape_owner_message]" + escape_prey_message = "[escape_prey_message]" + escape_outside_message = "[escape_outside_message]" release_specific_contents(R) - to_chat(R,"You climb out of \the [lowertext(name)].") - to_chat(owner,"[R] climbs out of your [lowertext(name)]!") + to_chat(R, escape_prey_message) + to_chat(owner, escape_owner_message) for(var/mob/M in hearers(4, owner)) - M.show_message("[R] climbs out of [owner]'s [lowertext(name)]!", 2) + M.show_message(escape_outside_message, 2) return else if(!(R.loc == src)) //Aren't even in the belly. Quietly fail. return else //Belly became inescapable. - to_chat(R,"Your attempt to escape [lowertext(name)] has failed!") - to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!") + to_chat(R, escape_fail_prey_message) + to_chat(owner, escape_fail_owner_message) 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. @@ -1599,13 +1890,32 @@ break if(!dest_belly) - to_chat(owner, "Something went wrong with your belly transfer settings. Your [lowertext(name)] has had it's transfer chance and transfer location cleared as a precaution.") + to_chat(owner, "Something went wrong with your belly transfer settings. Your [lowertext(name)] has had it's transfer chance and transfer location cleared as a precaution.") 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) - to_chat(R, "Your attempt to escape [lowertext(name)] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!") - to_chat(owner, "Someone slid into your [transferlocation] due to their struggling inside your [lowertext(name)]!") + 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 = "[primary_transfer_owner_message]" + primary_transfer_prey_message = "[primary_transfer_prey_message]" + + to_chat(R, primary_transfer_prey_message) + to_chat(owner, primary_transfer_owner_message) if(C) transfer_contents(C, dest_belly) return @@ -1620,13 +1930,33 @@ break if(!dest_belly) - to_chat(owner, "Something went wrong with your belly transfer settings. Your [lowertext(name)] has had it's transfer chance and transfer location cleared as a precaution.") + to_chat(owner, "Something went wrong with your belly transfer settings. Your [lowertext(name)] has had it's transfer chance and transfer location cleared as a precaution.") transferchance_secondary = 0 transferlocation_secondary = null return - to_chat(R, "Your attempt to escape [lowertext(name)] has failed and your struggles only results in you sliding into [owner]'s [transferlocation_secondary]!") - to_chat(owner, "Someone slid into your [transferlocation_secondary] due to their struggling inside your [lowertext(name)]!") + 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 = "[secondary_transfer_owner_message]" + secondary_transfer_prey_message = "[secondary_transfer_prey_message]" + + to_chat(R, secondary_transfer_prey_message) + to_chat(owner, secondary_transfer_owner_message) if(C) transfer_contents(C, dest_belly) return @@ -1634,20 +1964,56 @@ return else if(prob(absorbchance) && digest_mode != DM_ABSORB) //After that, let's have it run the absorb chance. - to_chat(R, "In response to your struggling, \the [lowertext(name)] begins to cling more tightly...") - to_chat(owner, "You feel your [lowertext(name)] start to cling onto its contents...") + 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 = "[absorb_chance_owner_message]" + absorb_chance_prey_message = "[absorb_chance_prey_message]" + + to_chat(R, absorb_chance_prey_message) + to_chat(owner, absorb_chance_owner_message) digest_mode = DM_ABSORB return else if(prob(digestchance) && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance. - to_chat(R, "In response to your struggling, \the [lowertext(name)] begins to get more active...") - to_chat(owner, "You feel your [lowertext(name)] beginning to become active!") + 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 = "[digest_chance_owner_message]" + digest_chance_prey_message = "[digest_chance_prey_message]" + + to_chat(R, digest_chance_prey_message) + to_chat(owner, digest_chance_owner_message) digest_mode = DM_DIGEST return else //Nothing interesting happened. to_chat(R, struggle_user_message) - to_chat(owner, "Your prey appears to be unable to make any progress in escaping your [lowertext(name)].") + to_chat(owner, "Your prey appears to be unable to make any progress in escaping your [lowertext(name)].") return to_chat(R, struggle_user_message) @@ -1675,8 +2041,8 @@ struggle_user_message = replacetext(struggle_user_message, "%belly", lowertext(name)) struggle_user_message = replacetext(struggle_user_message, "%countprey", absorbed_count) - struggle_outer_message = "[struggle_outer_message]" - struggle_user_message = "[struggle_user_message]" + struggle_outer_message = "[struggle_outer_message]" + struggle_user_message = "[struggle_user_message]" for(var/mob/M in hearers(4, owner)) M.show_message(struggle_outer_message, 2) // hearable @@ -1696,21 +2062,90 @@ //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. - to_chat(R, "You try to force yourself out of \the [lowertext(name)].") - to_chat(owner, "Someone is attempting to free themselves from your [lowertext(name)]!") + + + 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 = "[escape_attempt_absorbed_owner_message]" + escape_attempt_absorbed_prey_message = "[escape_attempt_absorbed_prey_message]" + + to_chat(R, escape_attempt_absorbed_prey_message) + to_chat(owner, escape_attempt_absorbed_owner_message) 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 = "[escape_absorbed_owner_message]" + escape_absorbed_prey_message = "[escape_absorbed_prey_message]" + escape_absorbed_outside_message = "[escape_absorbed_outside_message]" + release_specific_contents(R) - to_chat(R,"You manage to free yourself from \the [lowertext(name)].") - to_chat(owner,"[R] forces themselves free of your [lowertext(name)]!") + to_chat(R, escape_absorbed_prey_message) + to_chat(owner, escape_absorbed_owner_message) for(var/mob/M in hearers(4, owner)) - M.show_message("[R] climbs out of [owner]'s [lowertext(name)]!", 2) + M.show_message(escape_absorbed_outside_message, 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. - to_chat(R,"Before you manage to reach freedom, you feel yourself getting dragged back into \the [lowertext(name)]!") - to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!") + + 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 = "[escape_fail_absorbed_owner_message]" + escape_fail_absorbed_prey_message = "[escape_fail_absorbed_prey_message]" + + to_chat(R, escape_fail_absorbed_prey_message) + to_chat(owner, escape_fail_absorbed_owner_message) return to_chat(R, struggle_user_message) @@ -1918,6 +2353,7 @@ 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 @@ -1939,6 +2375,7 @@ dupe.belly_fullscreen_color3 = belly_fullscreen_color3 dupe.belly_fullscreen_color4 = belly_fullscreen_color4 dupe.belly_fullscreen_alpha = belly_fullscreen_alpha + dupe.show_liquids = show_liquids dupe.reagentbellymode = reagentbellymode dupe.vorefootsteps_sounds = vorefootsteps_sounds dupe.liquid_fullness1_messages = liquid_fullness1_messages @@ -2045,6 +2482,131 @@ 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) diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 02c2da0cd5..2fddac73f2 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -155,7 +155,7 @@ formatted_message = replacetext(formatted_message, "%prey", M) formatted_message = replacetext(formatted_message, "%countprey", absorbed_count) if(formatted_message) - to_chat(M, "[formatted_message]") + to_chat(M, "[formatted_message]") else if (digest_mode == DM_SELECT) var/datum/digest_mode/selective/DM_S = GLOB.digest_modes[DM_SELECT] @@ -171,7 +171,7 @@ formatted_message = replacetext(formatted_message, "%countprey", living_count) formatted_message = replacetext(formatted_message, "%count", contents.len) if(formatted_message) - to_chat(M, "[formatted_message]") + to_chat(M, "[formatted_message]") if(to_update) updateVRPanels() @@ -301,7 +301,7 @@ if(!M.digestion_in_progress) M.digestion_in_progress = TRUE if(M.health > -36 || (ishuman(M) && M.health > -136)) - to_chat(M, "(Your predator has enabled gradual body digestion. Stick around for a second round of churning to reach the true finisher.)") + to_chat(M, "(Your predator has enabled gradual body digestion. Stick around for a second round of churning to reach the true finisher.)") if(M.health < M.maxHealth * -1) //Siplemobs etc if(ishuman(M)) if(M.health < (M.maxHealth * -1) -100) //Spacemans can go much deeper. Jank but maxHealth*-2 doesn't work with flat standard -100hp death threshold. @@ -350,8 +350,8 @@ digest_alert_prey = replacetext(digest_alert_prey, "%count", contents.len) //Send messages - to_chat(owner, "[digest_alert_owner]") - to_chat(M, "[digest_alert_prey]") + to_chat(owner, "[digest_alert_owner]") + to_chat(M, "[digest_alert_prey]") if(M.ckey) GLOB.prey_digested_roundstat++ diff --git a/code/modules/vore/eating/exportpanel_vr.dm b/code/modules/vore/eating/exportpanel_vr.dm new file mode 100644 index 0000000000..f8ab64b58b --- /dev/null +++ b/code/modules/vore/eating/exportpanel_vr.dm @@ -0,0 +1,238 @@ +//CHOMPERemove. We got our own. We don't use this. Only here as a reminder on further PRs. +/* +// +// Belly Export Panel +// +/datum/vore_look/export_panel/proc/open_export_panel(mob/user) + tgui_interact(user) +/datum/vore_look/export_panel/tgui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "VorePanelExport", "Vore Export Panel") + ui.open() + ui.set_autoupdate(FALSE) +/datum/vore_look/export_panel/tgui_fallback(payload) + if(..()) + return TRUE + //var/mob/living/host = usr + //host.vorebelly_printout(TRUE) +/datum/vore_look/export_panel/tgui_act(action, params) + if(..()) + return TRUE +/datum/vore_look/export_panel/tgui_data(mob/user) + var/list/data = list() + var/mob/living/host = user + data["db_version"] = "0.1" + data["db_repo"] = "vorestation" + data["mob_name"] = host.real_name + for(var/belly in host.vore_organs) + if(isbelly(belly)) + var/obj/belly/B = belly + var/belly_data = list() + // General Information + belly_data["name"] = B.name + belly_data["desc"] = B.desc + belly_data["absorbed_desc"] = B.absorbed_desc + belly_data["vore_verb"] = B.vore_verb + belly_data["release_verb"] = B.release_verb + // Controls + belly_data["mode"] = B.digest_mode + var/list/addons = list() + for(var/flag_name in B.mode_flag_list) + if(B.mode_flags & B.mode_flag_list[flag_name]) + addons.Add(flag_name) + belly_data["addons"] = addons + belly_data["item_mode"] = B.item_digest_mode + // Messages + belly_data["struggle_messages_outside"] = list() + for(var/msg in B.struggle_messages_outside) + belly_data["struggle_messages_outside"] += msg + belly_data["struggle_messages_inside"] = list() + for(var/msg in B.struggle_messages_inside) + belly_data["struggle_messages_inside"] += msg + belly_data["absorbed_struggle_messages_outside"] = list() + for(var/msg in B.absorbed_struggle_messages_outside) + belly_data["absorbed_struggle_messages_outside"] += msg + belly_data["absorbed_struggle_messages_inside"] = list() + 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 + belly_data["digest_messages_prey"] = list() + for(var/msg in B.digest_messages_prey) + belly_data["digest_messages_prey"] += msg + belly_data["absorb_messages_owner"] = list() + for(var/msg in B.absorb_messages_owner) + belly_data["absorb_messages_owner"] += msg + belly_data["absorb_messages_prey"] = list() + for(var/msg in B.absorb_messages_prey) + belly_data["absorb_messages_prey"] += msg + belly_data["unabsorb_messages_owner"] = list() + for(var/msg in B.unabsorb_messages_owner) + belly_data["unabsorb_messages_owner"] += msg + belly_data["unabsorb_messages_prey"] = list() + for(var/msg in B.unabsorb_messages_prey) + belly_data["unabsorb_messages_prey"] += msg + belly_data["examine_messages"] = list() + for(var/msg in B.examine_messages) + belly_data["examine_messages"] += msg + belly_data["examine_messages_absorbed"] = list() + for(var/msg in B.examine_messages_absorbed) + belly_data["examine_messages_absorbed"] += msg + //belly_data["emote_list"] = list() + //for(var/EL in B.emote_lists) + // for(var/msg in B.emote_lists[EL]) + // msg_list += msg + // + // belly_data["emote_lists"] += list(EL, msg_list) + // I will use this first before the code above gets fixed + belly_data["emotes_digest"] = list() + for(var/msg in B.emote_lists[DM_DIGEST]) + belly_data["emotes_digest"] += msg + belly_data["emotes_hold"] = list() + for(var/msg in B.emote_lists[DM_HOLD]) + belly_data["emotes_hold"] += msg + belly_data["emotes_holdabsorbed"] = list() + for(var/msg in B.emote_lists[DM_HOLD_ABSORBED]) + belly_data["emotes_holdabsorbed"] += msg + belly_data["emotes_absorb"] = list() + for(var/msg in B.emote_lists[DM_ABSORB]) + belly_data["emotes_absorb"] += msg + belly_data["emotes_heal"] = list() + for(var/msg in B.emote_lists[DM_HEAL]) + belly_data["emotes_heal"] += msg + belly_data["emotes_drain"] = list() + for(var/msg in B.emote_lists[DM_DRAIN]) + belly_data["emotes_drain"] += msg + belly_data["emotes_steal"] = list() + for(var/msg in B.emote_lists[DM_SIZE_STEAL]) + belly_data["emotes_steal"] += msg + belly_data["emotes_egg"] = list() + for(var/msg in B.emote_lists[DM_EGG]) + belly_data["emotes_egg"] += msg + belly_data["emotes_shrink"] = list() + for(var/msg in B.emote_lists[DM_SHRINK]) + belly_data["emotes_shrink"] += msg + belly_data["emotes_grow"] = list() + for(var/msg in B.emote_lists[DM_GROW]) + belly_data["emotes_grow"] += msg + belly_data["emotes_unabsorb"] = list() + for(var/msg in B.emote_lists[DM_UNABSORB]) + belly_data["emotes_unabsorb"] += msg + // Options + belly_data["digest_brute"] = B.digest_brute + belly_data["digest_burn"] = B.digest_burn + belly_data["digest_oxy"] = B.digest_oxy + belly_data["digest_tox"] = B.digest_tox + belly_data["digest_clone"] = B.digest_clone + belly_data["can_taste"] = B.can_taste + belly_data["contaminates"] = B.contaminates + belly_data["contamination_flavor"] = B.contamination_flavor + belly_data["contamination_color"] = B.contamination_color + belly_data["nutrition_percent"] = B.nutrition_percent + belly_data["bulge_size"] = B.bulge_size + belly_data["display_absorbed_examine"] = B.display_absorbed_examine + belly_data["save_digest_mode"] = B.save_digest_mode + belly_data["emote_active"] = B.emote_active + belly_data["emote_time"] = B.emote_time + belly_data["shrink_grow_size"] = B.shrink_grow_size + belly_data["egg_type"] = B.egg_type + belly_data["selective_preference"] = B.selective_preference + // Sounds + belly_data["is_wet"] = B.is_wet + belly_data["wet_loop"] = B.wet_loop + belly_data["fancy_vore"] = B.fancy_vore + belly_data["vore_sound"] = B.vore_sound + belly_data["release_sound"] = B.release_sound + // Visuals (Vore FX) + belly_data["disable_hud"] = B.disable_hud + // Interactions + 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 + belly_data["transferlocation"] = B.transferlocation + belly_data["transferchance_secondary"] = B.transferchance_secondary + belly_data["transferlocation_secondary"] = B.transferlocation_secondary + belly_data["absorbchance"] = B.absorbchance + belly_data["digestchance"] = B.digestchance + data["bellies"] += list(belly_data) + return data + */ diff --git a/code/modules/vore/eating/living_ch.dm b/code/modules/vore/eating/living_ch.dm index 81394d6921..feb1162a55 100644 --- a/code/modules/vore/eating/living_ch.dm +++ b/code/modules/vore/eating/living_ch.dm @@ -114,7 +114,7 @@ if(!RTB) return FALSE - to_chat(src, "[RTB] has [RTB.reagents.total_volume] units of liquid.") + to_chat(src, "[RTB] has [RTB.reagents.total_volume] units of liquid.") /mob/living/proc/vore_transfer_reagents() set name = "Transfer Liquid (Vore)" @@ -131,7 +131,7 @@ if(!TG) return FALSE if(TG.give_reagents == FALSE && user != TG) //User isnt forced to allow giving in prefs if they are the one doing it - to_chat(user, "This person's prefs dont allow that!") + to_chat(user, "This person's prefs dont allow that!") return FALSE var/obj/belly/RTB = input("Choose which vore belly to transfer from") as null|anything in TG.vore_organs //First they choose the belly to transfer from. @@ -156,20 +156,20 @@ if(!Adjacent(TR) || !Adjacent(TG)) return //No long distance transfer if(!TR.reagents.get_free_space()) - to_chat(user, "[TB] is full!") + to_chat(user, "[TB] is full!") return FALSE if(TG == user) - user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into their [lowertext(TB.name)].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into their [lowertext(TB.name)].") else - user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into their [lowertext(TB.name)].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into their [lowertext(TB.name)].") add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s [TB]") //Bonus for staff so they can see if people have abused transfer and done pref breaks RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_VORE, 1, 0, TB) if(RTB.count_liquid_for_sprite || TB.count_liquid_for_sprite) update_fullness() else if(TR.receive_reagents == FALSE) - to_chat(user, "This person's prefs dont allow that!") + to_chat(user, "This person's prefs dont allow that!") return FALSE else @@ -179,13 +179,13 @@ if(!Adjacent(TR) || !Adjacent(TG)) return //No long distance transfer if(!TR.reagents.get_free_space()) - to_chat(user, "[TR]'s [lowertext(TB.name)] is full!") + to_chat(user, "[TR]'s [lowertext(TB.name)] is full!") return FALSE if(TG == user) - user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into [TR]'s [lowertext(TB.name)].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into [TR]'s [lowertext(TB.name)].") else - user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]s [lowertext(RTB.name)] into [TR]'s [lowertext(TB.name)].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]s [lowertext(RTB.name)] into [TR]'s [lowertext(TB.name)].") RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_VORE, 1, 0, TB) add_attack_logs(user,TR,"Transfered reagents from [TG]'s [RTB] to [TR]'s [TB]") //Bonus for staff so they can see if people have abused transfer and done pref breaks @@ -203,23 +203,23 @@ if(TR == user) //Proceed, we dont need to have prefs enabled for transfer within user if(TG == user) - user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into their stomach.") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into their stomach.") else - user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into their stomach.") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into their stomach.") RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_INGEST, 1, 0, null) add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s Stomach") if(RTB.count_liquid_for_sprite) update_fullness() else if(TR.receive_reagents == FALSE) - to_chat(user, "This person's prefs dont allow that!") + to_chat(user, "This person's prefs dont allow that!") return FALSE else if(TG == user) - user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into [TR]'s stomach.") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into [TR]'s stomach.") else - user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into [TR]'s stomach.") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into [TR]'s stomach.") RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_INGEST, 1, 0, null) add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s Stomach") //Bonus for staff so they can see if people have abused transfer and done pref breaks @@ -239,9 +239,9 @@ return //No long distance transfer if(TG == user) - user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into [T].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into [T].") else - user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into [T].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into [T].") RTB.reagents.vore_trans_to_con(T, transfer_amount, 1, 0) add_attack_logs(user, T,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to a [T]") //Bonus for staff so they can see if people have abused transfer and done pref breaks @@ -256,13 +256,13 @@ var/puddle_amount = round(amount_removed/5) if(puddle_amount == 0) - to_chat(user,"[RTB.reagent_name] dripples from the [lowertext(RTB.name)], not enough to form a puddle. ") + to_chat(user,"[RTB.reagent_name] dripples from the [lowertext(RTB.name)], not enough to form a puddle. ") return if(TG == user) - user.custom_emote_vr(1, "spills [RTB.reagent_name] from their [lowertext(RTB.name)] onto the floor!") + user.custom_emote_vr(1, "spills [RTB.reagent_name] from their [lowertext(RTB.name)] onto the floor!") else - user.custom_emote_vr(1, "spills [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] onto the floor!") + user.custom_emote_vr(1, "spills [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] onto the floor!") var/obj/effect/decal/cleanable/blood/reagent/puddle = new /obj/effect/decal/cleanable/blood/reagent(RTB.reagent_name, RTB.reagentcolor, RTB.reagentid, puddle_amount, user.ckey, TG.ckey) puddle.loc = TG.loc @@ -295,7 +295,7 @@ custom_emote_vr(1, "gives some rubs over [T]'s [lowertext(B.name)].") B.quick_cycle() return TRUE - to_chat(src, "There is no suitable belly for rubs.") + to_chat(src, "There is no suitable belly for rubs.") return FALSE /mob/living/proc/mute_entry() @@ -303,28 +303,28 @@ set category = "Preferences" set desc = "Mute the chatlog messages when something enters a vore belly." mute_entry = !mute_entry - to_chat(src, "Entrance logs [mute_entry ? "disabled" : "enabled"].") + to_chat(src, "Entrance logs [mute_entry ? "disabled" : "enabled"].") /mob/living/proc/toggle_trash_catching() set name = "Toggle Trash Catching" set category = "Abilities" set desc = "Toggle Trash Eater throw vore abilities." trash_catching = !trash_catching - to_chat(src, "Trash catching [trash_catching ? "enabled" : "disabled"].") + to_chat(src, "Trash catching [trash_catching ? "enabled" : "disabled"].") /mob/living/proc/restrict_trasheater() set name = "Restrict Trash Eater" set category = "Abilities" set desc = "Toggle Trash Eater restriction level." adminbus_trash = !adminbus_trash - to_chat(src, "Trash Eater restriction level set to [adminbus_trash ? "everything not blacklisted" : "only whitelisted items"].") + to_chat(src, "Trash Eater restriction level set to [adminbus_trash ? "everything not blacklisted" : "only whitelisted items"].") /mob/living/proc/liquidbelly_visuals() set name = "Toggle Liquidbelly Visuals" set category = "Preferences" set desc = "Toggle liquidbelly fullscreen visual effect." liquidbelly_visuals = !liquidbelly_visuals - to_chat(src, "Liquidbelly overlays [liquidbelly_visuals ? "enabled" : "disabled"].") + to_chat(src, "Liquidbelly overlays [liquidbelly_visuals ? "enabled" : "disabled"].") /mob/living/proc/fix_vore_effects() set name = "Fix Vore Effects" @@ -345,4 +345,4 @@ set name = "Check Nutrition" set category = "Abilities" set desc = "Check your current nutrition level." - to_chat(src, "Current nutrition level: [nutrition].") + to_chat(src, "Current nutrition level: [nutrition].") diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 872ffd1868..8163e09fa5 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -111,7 +111,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, "[G.affecting] isn't willing to be fed.") + to_chat(user, "[G.affecting] isn't willing to be fed.") 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 @@ -124,11 +124,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, "[src] isn't willing to be fed.") + to_chat(user, "[src] isn't willing to be fed.") 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, "[G.affecting] isn't able to be devoured.") + to_chat(user, "[G.affecting] isn't able to be devoured.") 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)) @@ -383,9 +383,9 @@ setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(tasted == src) //CHOMPEdit Start - visible_message("[src] licks themself!","You lick yourself. You taste rather like [tasted.get_taste_message()].","Slurp!") + visible_message("[src] licks themself!","You lick yourself. You taste rather like [tasted.get_taste_message()].","Slurp!") else - visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!") //CHOMPEdit End + visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!") //CHOMPEdit End /mob/living/proc/get_taste_message(allow_generic = 1) @@ -425,9 +425,9 @@ setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(smelled == src) //CHOMPEdit Start - visible_message("[src] smells themself!","You smell yourself. You smell like [smelled.get_smell_message()].","Sniff!") + visible_message("[src] smells themself!","You smell yourself. You smell like [smelled.get_smell_message()].","Sniff!") else - visible_message("[src] smells [smelled]!","You smell [smelled]. They smell like [smelled.get_smell_message()].","Sniff!") //CHOMPEdit End + visible_message("[src] smells [smelled]!","You smell [smelled]. They smell like [smelled.get_smell_message()].","Sniff!") //CHOMPEdit End /mob/living/proc/get_smell_message(allow_generic = 1) if(!vore_smell && !allow_generic) @@ -593,11 +593,11 @@ return FALSE if(!prey.devourable) - to_chat(user, "They aren't able to be devoured.") + to_chat(user, "They aren't able to be devoured.") 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, "They aren't aren't in a state to be devoured.") + to_chat(user, "They aren't aren't in a state to be devoured.") return FALSE //Determining vore attempt privacy @@ -615,17 +615,17 @@ // Slipnoms from chompstation downstream, credit to cadyn for the original PR. // Prepare messages if(prey.is_slipping) - attempt_msg = "It seems like [prey] is about to slide into [pred]'s [lowertext(belly.name)]!" - success_msg = "[prey] suddenly slides into [pred]'s [lowertext(belly.name)]!" + attempt_msg = "It seems like [prey] is about to slide into [pred]'s [lowertext(belly.name)]!" + success_msg = "[prey] suddenly slides into [pred]'s [lowertext(belly.name)]!" else if(pred.is_slipping) - attempt_msg = "It seems like [prey] is gonna end up inside [pred]'s [lowertext(belly.name)] as [pred] comes sliding over!" - success_msg = "[prey] suddenly slips inside of [pred]'s [lowertext(belly.name)] as [pred] slides into them!" + attempt_msg = "It seems like [prey] is gonna end up inside [pred]'s [lowertext(belly.name)] as [pred] comes sliding over!" + success_msg = "[prey] suddenly slips inside of [pred]'s [lowertext(belly.name)] as [pred] slides into them!" else if(user == pred) //Feeding someone to yourself - attempt_msg = "[pred] is attempting to [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!" - success_msg = "[pred] manages to [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!" + attempt_msg = "[pred] is attempting to [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!" + success_msg = "[pred] manages to [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!" else //Feeding someone to another person - attempt_msg = "[user] is attempting to make [pred] [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!" - success_msg = "[user] manages to make [pred] [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!" + attempt_msg = "[user] is attempting to make [pred] [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!" + success_msg = "[user] manages to make [pred] [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!" // Announce that we start the attempt! @@ -1177,7 +1177,6 @@ set category = "Preferences" set desc = "Print out your vorebelly messages into chat for copypasting." - //CHOMPEdit - "Belly HTML Export Earlyport" var/result = tgui_alert(src, "Would you rather open the export panel?", "Selected Belly Export", list("Open Panel", "Print to Chat")) if(result == "Open Panel") var/mob/living/user = usr @@ -1198,50 +1197,126 @@ for(var/belly in vore_organs) if(isbelly(belly)) var/obj/belly/B = belly - to_chat(src, "Belly name: [B.name]") - to_chat(src, "Belly desc: [B.desc]") - to_chat(src, "Belly absorbed desc: [B.absorbed_desc]") - to_chat(src, "Vore verb: [B.vore_verb]") - to_chat(src, "Struggle messages (outside):") + to_chat(src, "Belly name: [B.name]") + to_chat(src, "Belly desc: [B.desc]") + to_chat(src, "Belly absorbed desc: [B.absorbed_desc]") + to_chat(src, "Vore verb: [B.vore_verb]") + to_chat(src, "Struggle messages (outside):") for(var/msg in B.struggle_messages_outside) - to_chat(src, "[msg]") - to_chat(src, "Struggle messages (inside):") + to_chat(src, "[msg]") + to_chat(src, "Struggle messages (inside):") for(var/msg in B.struggle_messages_inside) - to_chat(src, "[msg]") - to_chat(src, "Absorbed struggle messages (outside):") + to_chat(src, "[msg]") + to_chat(src, "Absorbed struggle messages (outside):") for(var/msg in B.absorbed_struggle_messages_outside) - to_chat(src, "[msg]") - to_chat(src, "Absorbed struggle messages (inside):") + to_chat(src, "[msg]") + to_chat(src, "Absorbed struggle messages (inside):") for(var/msg in B.absorbed_struggle_messages_inside) - to_chat(src, "[msg]") - to_chat(src, "Digest messages (owner):") + to_chat(src, "[msg]") + to_chat(src, "Escape attempt messages (owner):") + for(var/msg in B.escape_attempt_messages_owner) + to_chat(src, "[msg]") + to_chat(src, "Escape attempt messages (prey):") + for(var/msg in B.escape_attempt_messages_prey) + to_chat(src, "[msg]") + to_chat(src, "Escape messages (owner):") + for(var/msg in B.escape_messages_owner) + to_chat(src, "[msg]") + to_chat(src, "Escape messages (prey):") + for(var/msg in B.escape_messages_prey) + to_chat(src, "[msg]") + to_chat(src, "Escape messages (outside):") + for(var/msg in B.escape_messages_outside) + to_chat(src, "[msg]") + to_chat(src, "Escape item messages (owner):") + for(var/msg in B.escape_item_messages_owner) + to_chat(src, "[msg]") + to_chat(src, "Escape item messages (prey):") + for(var/msg in B.escape_item_messages_prey) + to_chat(src, "[msg]") + to_chat(src, "Escape item messages (outside):") + for(var/msg in B.escape_item_messages_outside) + to_chat(src, "[msg]") + to_chat(src, "Escape fail messages (owner):") + for(var/msg in B.escape_fail_messages_owner) + to_chat(src, "[msg]") + to_chat(src, "Escape fail messages (prey):") + for(var/msg in B.escape_fail_messages_prey) + to_chat(src, "[msg]") + to_chat(src, "Absorbed escape attempt messages (owner):") + for(var/msg in B.escape_attempt_absorbed_messages_owner) + to_chat(src, "[msg]") + to_chat(src, "Absorbed escape attempt messages (prey):") + for(var/msg in B.escape_attempt_absorbed_messages_prey) + to_chat(src, "[msg]") + to_chat(src, "Absorbed escape messages (owner):") + for(var/msg in B.escape_absorbed_messages_owner) + to_chat(src, "[msg]") + to_chat(src, "Absorbed escape messages (prey):") + for(var/msg in B.escape_absorbed_messages_prey) + to_chat(src, "[msg]") + to_chat(src, "Absorbed escape messages (outside):") + for(var/msg in B.escape_absorbed_messages_outside) + to_chat(src, "[msg]") + to_chat(src, "Absorbed escape fail messages (owner):") + for(var/msg in B.escape_fail_absorbed_messages_owner) + to_chat(src, "[msg]") + to_chat(src, "Absorbed escape fail messages (prey):") + for(var/msg in B.escape_fail_absorbed_messages_prey) + to_chat(src, "[msg]") + to_chat(src, "Primary transfer messages (owner):") + for(var/msg in B.primary_transfer_messages_owner) + to_chat(src, "[msg]") + to_chat(src, "Primary transfer messages (prey):") + for(var/msg in B.primary_transfer_messages_prey) + to_chat(src, "[msg]") + to_chat(src, "Secondary transfer messages (owner):") + for(var/msg in B.secondary_transfer_messages_owner) + to_chat(src, "[msg]") + to_chat(src, "Secondary transfer messages (prey):") + for(var/msg in B.secondary_transfer_messages_prey) + to_chat(src, "[msg]") + to_chat(src, "Digest chance messages (owner):") + for(var/msg in B.digest_chance_messages_owner) + to_chat(src, "[msg]") + to_chat(src, "Digest chance messages (prey):") + for(var/msg in B.digest_chance_messages_prey) + to_chat(src, "[msg]") + to_chat(src, "Absorb chance messages (owner):") + for(var/msg in B.absorb_chance_messages_owner) + to_chat(src, "[msg]") + to_chat(src, "Absorb chance messages (prey):") + for(var/msg in B.absorb_chance_messages_prey) + to_chat(src, "[msg]") + to_chat(src, "Digest messages (owner):") for(var/msg in B.digest_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Digest messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Digest messages (prey):") for(var/msg in B.digest_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Absorb messages:") + to_chat(src, "[msg]") + to_chat(src, "Absorb messages (owner):") for(var/msg in B.absorb_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Absorb messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Absorb messages (prey):") for(var/msg in B.absorb_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Unabsorb messages:") + to_chat(src, "[msg]") + to_chat(src, "Unabsorb messages (owner):") for(var/msg in B.unabsorb_messages_owner) - to_chat(src, "[msg]") - to_chat(src, "Unabsorb messages (prey):") + to_chat(src, "[msg]") + to_chat(src, "Unabsorb messages (prey):") for(var/msg in B.unabsorb_messages_prey) - to_chat(src, "[msg]") - to_chat(src, "Examine messages:") + to_chat(src, "[msg]") + to_chat(src, "Examine messages (when full):") for(var/msg in B.examine_messages) - to_chat(src, "[msg]") + to_chat(src, "[msg]") + to_chat(src, "Examine messages (with absorbed victims):") for(var/msg in B.examine_messages_absorbed) - to_chat(src, "[msg]") - to_chat(src, "Emote lists:") + to_chat(src, "[msg]") + to_chat(src, "Emote lists:") for(var/EL in B.emote_lists) - to_chat(src, "[EL]:") + to_chat(src, "[EL]:") for(var/msg in B.emote_lists[EL]) - to_chat(src, "[msg]") + to_chat(src, "[msg]") //CHOMPEdit End /** diff --git a/code/modules/vore/eating/silicon_vr.dm b/code/modules/vore/eating/silicon_vr.dm index 52a450a58c..e43b736f0e 100644 --- a/code/modules/vore/eating/silicon_vr.dm +++ b/code/modules/vore/eating/silicon_vr.dm @@ -25,7 +25,7 @@ bellied = prey prey.forceMove(src) visible_message("[src] entirely engulfs [prey] in hardlight holograms!") - to_chat(usr, "You completely engulf [prey] in hardlight holograms!") //Can't be part of the above, because the above is from the hologram. + to_chat(usr, "You completely engulf [prey] in hardlight holograms!") //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, "You can only use this when holo-projecting!") + to_chat(usr, "You can only use this when holo-projecting!") 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, "Invalid mob choice!") + to_chat(usr, "Invalid mob choice!") return hologram.visible_message("[hologram] starts engulfing [prey] in hardlight holograms!") - to_chat(src, "You begin engulfing [prey] in hardlight holograms.") //Can't be part of the above, because the above is from the hologram. + to_chat(src, "You begin engulfing [prey] in hardlight holograms.") //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) diff --git a/code/modules/vore/eating/stumblevore_vr.dm b/code/modules/vore/eating/stumblevore_vr.dm index cdaae1d5df..a979c210a8 100644 --- a/code/modules/vore/eating/stumblevore_vr.dm +++ b/code/modules/vore/eating/stumblevore_vr.dm @@ -32,13 +32,13 @@ M.Weaken(4) M.stop_flying() if(CanStumbleVore(M)) - visible_message("[M] flops carelessly into [src]!") + visible_message("[M] flops carelessly into [src]!") perform_the_nom(src,M,src,src.vore_selected,1) else if(M.CanStumbleVore(src)) - visible_message("[M] flops carelessly into [src]!") + visible_message("[M] flops carelessly into [src]!") perform_the_nom(M,src,M,M.vore_selected,1) else if(istype(S) && S.species.lightweight == 1) - visible_message("[M] carelessly bowls [src] over!") + visible_message("[M] carelessly bowls [src] over!") 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("[M] bounces backwards off of [src]'s plush body!") + visible_message("[M] bounces backwards off of [src]'s plush body!") M.throw_at(throwtarget, 2, 1) else - visible_message("[M] trips over [src]!") + visible_message("[M] trips over [src]!") M.forceMove(get_turf(src)) M.apply_damage(1, BRUTE) diff --git a/code/modules/vore/eating/transforming_vr.dm b/code/modules/vore/eating/transforming_vr.dm index e8de8d466b..638aa1d599 100644 --- a/code/modules/vore/eating/transforming_vr.dm +++ b/code/modules/vore/eating/transforming_vr.dm @@ -11,5 +11,5 @@ M.forceMove(egg) egg.name = egg_name if(message) - to_chat(M, "You lose sensation of your body, feeling only the warmth around you as you're encased in an egg.") - to_chat(O, "Your body shifts as you encase [M] in an egg.") + to_chat(M, "You lose sensation of your body, feeling only the warmth around you as you're encased in an egg.") + to_chat(O, "Your body shifts as you encase [M] in an egg.") diff --git a/code/modules/vore/eating/vertical_nom_vr.dm b/code/modules/vore/eating/vertical_nom_vr.dm index c9ff0a3096..658f6496cf 100644 --- a/code/modules/vore/eating/vertical_nom_vr.dm +++ b/code/modules/vore/eating/vertical_nom_vr.dm @@ -31,17 +31,17 @@ if(!target) return - to_chat(target, "You feel yourself being pulled up by something... Or someone?!") + to_chat(target, "You feel yourself being pulled up by something... Or someone?!") var/starting_loc = target.loc if(do_after(src, 50)) if(target.loc != starting_loc) - to_chat(target, "You have interrupted whatever that was...") - to_chat(src, "They got away.") + to_chat(target, "You have interrupted whatever that was...") + to_chat(src, "They got away.") return if(target.buckled) target.buckled.unbuckle_mob() - target.visible_message("\The [target] suddenly disappears somewhere above!",\ - "You are dragged above and feel yourself slipping directly into \the [src]'s [vore_selected]!") - to_chat(src, "You successfully snatch \the [target], slipping them into your [vore_selected].") - target.forceMove(src.vore_selected) \ No newline at end of file + target.visible_message("\The [target] suddenly disappears somewhere above!",\ + "You are dragged above and feel yourself slipping directly into \the [src]'s [vore_selected]!") + to_chat(src, "You successfully snatch \the [target], slipping them into your [vore_selected].") + target.forceMove(src.vore_selected) diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 105d8314da..f9240e830d 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -326,6 +326,7 @@ 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 @@ -752,6 +753,131 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", if(new_absorbed_struggle_messages_inside) new_belly.set_messages(new_absorbed_struggle_messages_inside,"asmi") + if(islist(belly_data["escape_attempt_messages_prey"])) + var/new_escape_attempt_messages_prey = sanitize(jointext(belly_data["escape_attempt_messages_prey"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_attempt_messages_prey) + new_belly.set_messages(new_escape_attempt_messages_prey,"escap") + + if(islist(belly_data["escape_attempt_messages_owner"])) + var/new_escape_attempt_messages_owner = sanitize(jointext(belly_data["escape_attempt_messages_owner"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_attempt_messages_owner) + new_belly.set_messages(new_escape_attempt_messages_owner,"escao") + + if(islist(belly_data["escape_messages_prey"])) + var/new_escape_messages_prey = sanitize(jointext(belly_data["escape_messages_prey"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_messages_prey) + new_belly.set_messages(new_escape_messages_prey,"escp") + + if(islist(belly_data["escape_messages_owner"])) + var/new_escape_messages_owner = sanitize(jointext(belly_data["escape_messages_owner"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_messages_owner) + new_belly.set_messages(new_escape_messages_owner,"esco") + + if(islist(belly_data["escape_messages_outside"])) + var/new_escape_messages_outside = sanitize(jointext(belly_data["escape_messages_outside"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_messages_outside) + new_belly.set_messages(new_escape_messages_outside,"escout") + + if(islist(belly_data["escape_item_messages_prey"])) + var/new_escape_item_messages_prey = sanitize(jointext(belly_data["escape_item_messages_prey"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_item_messages_prey) + new_belly.set_messages(new_escape_item_messages_prey,"escip") + + if(islist(belly_data["escape_item_messages_owner"])) + var/new_escape_item_messages_owner = sanitize(jointext(belly_data["escape_item_messages_owner"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_item_messages_owner) + new_belly.set_messages(new_escape_item_messages_owner,"escio") + + if(islist(belly_data["escape_item_messages_outside"])) + var/new_escape_item_messages_outside = sanitize(jointext(belly_data["escape_item_messages_outside"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_item_messages_outside) + new_belly.set_messages(new_escape_item_messages_outside,"esciout") + + if(islist(belly_data["escape_fail_messages_prey"])) + var/new_escape_fail_messages_prey = sanitize(jointext(belly_data["escape_fail_messages_prey"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_fail_messages_prey) + new_belly.set_messages(new_escape_fail_messages_prey,"escfp") + + if(islist(belly_data["escape_fail_messages_owner"])) + var/new_escape_fail_messages_owner = sanitize(jointext(belly_data["escape_fail_messages_owner"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_fail_messages_owner) + new_belly.set_messages(new_escape_fail_messages_owner,"escfo") + + if(islist(belly_data["escape_attempt_absorbed_messages_prey"])) + var/new_escape_attempt_absorbed_messages_prey = sanitize(jointext(belly_data["escape_attempt_absorbed_messages_prey"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_attempt_absorbed_messages_prey) + new_belly.set_messages(new_escape_attempt_absorbed_messages_prey,"aescap") + + if(islist(belly_data["escape_attempt_absorbed_messages_owner"])) + var/new_escape_attempt_absorbed_messages_owner = sanitize(jointext(belly_data["escape_attempt_absorbed_messages_owner"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_attempt_absorbed_messages_owner) + new_belly.set_messages(new_escape_attempt_absorbed_messages_owner,"aescao") + + if(islist(belly_data["escape_absorbed_messages_prey"])) + var/new_escape_absorbed_messages_prey = sanitize(jointext(belly_data["escape_absorbed_messages_prey"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_absorbed_messages_prey) + new_belly.set_messages(new_escape_absorbed_messages_prey,"aescp") + + if(islist(belly_data["escape_absorbed_messages_owner"])) + var/new_escape_absorbed_messages_owner = sanitize(jointext(belly_data["escape_absorbed_messages_owner"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_absorbed_messages_owner) + new_belly.set_messages(new_escape_absorbed_messages_owner,"aesco") + + if(islist(belly_data["escape_absorbed_messages_outside"])) + var/new_escape_absorbed_messages_outside = sanitize(jointext(belly_data["escape_absorbed_messages_outside"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_absorbed_messages_outside) + new_belly.set_messages(new_escape_absorbed_messages_outside,"aescout") + + if(islist(belly_data["escape_fail_absorbed_messages_prey"])) + var/new_escape_fail_absorbed_messages_prey = sanitize(jointext(belly_data["escape_fail_absorbed_messages_prey"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_fail_absorbed_messages_prey) + new_belly.set_messages(new_escape_fail_absorbed_messages_prey,"aescfp") + + if(islist(belly_data["escape_fail_absorbed_messages_owner"])) + var/new_escape_fail_absorbed_messages_owner = sanitize(jointext(belly_data["escape_fail_absorbed_messages_owner"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_escape_fail_absorbed_messages_owner) + new_belly.set_messages(new_escape_fail_absorbed_messages_owner,"aescfo") + + if(islist(belly_data["primary_transfer_messages_prey"])) + var/new_primary_transfer_messages_prey = sanitize(jointext(belly_data["primary_transfer_messages_prey"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_primary_transfer_messages_prey) + new_belly.set_messages(new_primary_transfer_messages_prey,"trnspp") + + if(islist(belly_data["primary_transfer_messages_owner"])) + var/new_primary_transfer_messages_owner = sanitize(jointext(belly_data["primary_transfer_messages_owner"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_primary_transfer_messages_owner) + new_belly.set_messages(new_primary_transfer_messages_owner,"trnspo") + + if(islist(belly_data["secondary_transfer_messages_prey"])) + var/new_secondary_transfer_messages_prey = sanitize(jointext(belly_data["secondary_transfer_messages_prey"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_secondary_transfer_messages_prey) + new_belly.set_messages(new_secondary_transfer_messages_prey,"trnssp") + + if(islist(belly_data["secondary_transfer_messages_owner"])) + var/new_secondary_transfer_messages_owner = sanitize(jointext(belly_data["secondary_transfer_messages_owner"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_secondary_transfer_messages_owner) + new_belly.set_messages(new_secondary_transfer_messages_owner,"trnsso") + + if(islist(belly_data["digest_chance_messages_prey"])) + var/new_digest_chance_messages_prey = sanitize(jointext(belly_data["digest_chance_messages_prey"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_digest_chance_messages_prey) + new_belly.set_messages(new_digest_chance_messages_prey,"stmodp") + + if(islist(belly_data["digest_chance_messages_owner"])) + var/new_digest_chance_messages_owner = sanitize(jointext(belly_data["digest_chance_messages_owner"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_digest_chance_messages_owner) + new_belly.set_messages(new_digest_chance_messages_owner,"stmodo") + + if(islist(belly_data["absorb_chance_messages_prey"])) + var/new_absorb_chance_messages_prey = sanitize(jointext(belly_data["absorb_chance_messages_prey"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_absorb_chance_messages_prey) + new_belly.set_messages(new_absorb_chance_messages_prey,"stmoap") + + if(islist(belly_data["absorb_chance_messages_owner"])) + var/new_absorb_chance_messages_owner = sanitize(jointext(belly_data["absorb_chance_messages_owner"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) + if(new_absorb_chance_messages_owner) + new_belly.set_messages(new_absorb_chance_messages_owner,"stmoao") + if(islist(belly_data["examine_messages"])) var/new_examine_messages = sanitize(jointext(belly_data["examine_messages"],"\n\n"),MAX_MESSAGE_LEN,0,0,0) if(new_examine_messages) @@ -1201,6 +1327,11 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", var/new_escapechance = belly_data["escapechance"] new_belly.escapechance = sanitize_integer(new_escapechance, 0, 100, initial(new_belly.escapechance)) + if(isnum(belly_data["escapechance_absorbed"])) + var/new_escapechance_absorbed = belly_data["escapechance_absorbed"] + new_belly.escapechance_absorbed = sanitize_integer(new_escapechance_absorbed, 0, 100, initial(new_belly.escapechance_absorbed)) + + if(isnum(belly_data["escapetime"])) var/new_escapetime = belly_data["escapetime"] new_belly.escapetime = sanitize_integer(new_escapetime*10, 10, 600, initial(new_belly.escapetime)) @@ -2435,6 +2566,131 @@ 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) @@ -2539,6 +2795,31 @@ 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) @@ -2794,6 +3075,11 @@ 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)) diff --git a/interface/skin.dmf b/interface/skin.dmf index 7f3d37acf8..16816bdef6 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1155,7 +1155,12 @@ window "mainwindow" saved-params = "pos;size;is-minimized;is-maximized" title = "CHOMPStation" // CHOMP Edit is-maximized = true +<<<<<<< HEAD icon = 'icons/ss13_64.png' // CHOMP Edit +======= + statusbar = false + icon = 'icons\\virgoicon.png' +>>>>>>> 625b440806... Merge pull request #15585 from VOREStation/selis-statusbar-fix macro = "macro" menu = "menu" elem "asset_cache_browser" @@ -1168,7 +1173,7 @@ window "mainwindow" saved-params = "" elem "hotkey_toggle" type = BUTTON - pos = 560,420 + pos = 560,400 size = 80x20 anchor1 = 100,100 anchor2 = -1,-1 @@ -1179,7 +1184,7 @@ window "mainwindow" elem "mainvsplit" type = CHILD pos = 3,0 - size = 634x416 + size = 634x400 anchor1 = 0,0 anchor2 = 100,100 saved-params = "splitter" @@ -1187,7 +1192,7 @@ window "mainwindow" is-vert = true elem "input" type = INPUT - pos = 3,420 + pos = 3,400 size = 517x20 anchor1 = 0,100 anchor2 = 100,100 @@ -1195,9 +1200,19 @@ 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,420 + pos = 520,400 size = 40x20 anchor1 = 100,100 anchor2 = -1,-1 @@ -1222,12 +1237,8 @@ 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 diff --git a/modular_chomp/code/modules/vore/eating/exportpanel_ch.dm b/modular_chomp/code/modules/vore/eating/exportpanel_ch.dm index f5cef5bd15..35e38ea717 100644 --- a/modular_chomp/code/modules/vore/eating/exportpanel_ch.dm +++ b/modular_chomp/code/modules/vore/eating/exportpanel_ch.dm @@ -69,6 +69,106 @@ 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 @@ -231,6 +331,7 @@ belly_data["escapable"] = B.escapable belly_data["escapechance"] = B.escapechance + belly_data["escapechance_absorbed"] = B.escapechance_absorbed belly_data["escapetime"] = B.escapetime/10 belly_data["transferchance"] = B.transferchance diff --git a/tgui/packages/tgui-panel/chat/constants.js b/tgui/packages/tgui-panel/chat/constants.js index 1d37bb0c2a..f9f58435c0 100644 --- a/tgui/packages/tgui-panel/chat/constants.js +++ b/tgui/packages/tgui-panel/chat/constants.js @@ -24,6 +24,7 @@ export const MESSAGE_TYPE_INTERNAL = 'internal'; 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'; @@ -66,6 +67,12 @@ export const MESSAGE_TYPES = [ 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', + }, { type: MESSAGE_TYPE_RADIO, name: 'Radio', diff --git a/tgui/packages/tgui-panel/index.js b/tgui/packages/tgui-panel/index.js index c980aa7e77..3ae3087304 100644 --- a/tgui/packages/tgui-panel/index.js +++ b/tgui/packages/tgui-panel/index.js @@ -7,6 +7,7 @@ // 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'; diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss index 97e608fdd9..3d929210a1 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss @@ -274,6 +274,30 @@ 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; @@ -459,6 +483,10 @@ img.icon.bigicon { color: #d82020; } +.valert { + color: #d82020; +} + .userdanger { color: #c51e1e; font-weight: bold; @@ -474,11 +502,20 @@ 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; @@ -545,6 +582,10 @@ img.icon.bigicon { color: #6685f5; } +.vnotice { + color: #6685f5; +} + .tinynotice { color: #6685f5; font-size: 85%; diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index 69f714d2c2..339adbc6d7 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -292,6 +292,30 @@ 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; @@ -476,6 +500,10 @@ img.icon.bigicon { color: #ff0000; } +.valert { + color: #ff0000; +} + h1.alert, h2.alert { color: #000000; @@ -496,6 +524,10 @@ h2.alert { color: #ff0000; } +.vdanger { + color: #ff0000; +} + .tinydanger { color: #ff0000; font-size: 85%; @@ -511,6 +543,11 @@ h2.alert { font-style: italic; } +.vwarning { + color: #ff0000; + font-style: italic; +} + .alertwarning { color: #ff0000; font-weight: bold; @@ -577,6 +614,10 @@ h2.alert { color: #000099; } +.vnotice { + color: #000099; +} + .tinynotice { color: #000099; font-size: 85%; diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss new file mode 100644 index 0000000000..4666c9cbbd --- /dev/null +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss @@ -0,0 +1,1341 @@ +/** + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + +@use 'sass:map'; +@use 'sass:color'; + +em { + font-style: normal; + font-weight: bold; +} + +img { + margin: 0; + padding: 0; + line-height: 1; + -ms-interpolation-mode: nearest-neighbor; + image-rendering: pixelated; +} + +img.icon { + height: 1em; + min-height: 16px; + width: auto; + vertical-align: bottom; +} + +a { + color: #397ea5; +} + +a.visited { + color: #7c00e6; +} + +a:visited { + color: #7c00e6; +} + +a.popt { + text-decoration: none; +} + +/* POPUPS */ + +.popup { + position: fixed; + top: 50%; + left: 50%; + background: #ddd; +} + +.popup .close { + position: absolute; + background: #aaa; + top: 0; + right: 0; + color: #333; + text-decoration: none; + z-index: 2; + padding: 0 10px; + height: 30px; + line-height: 30px; +} + +.popup .close:hover { + background: #999; +} + +.popup .head { + background: #999; + color: #ddd; + padding: 0 10px; + height: 30px; + line-height: 30px; + text-transform: uppercase; + font-size: 0.9em; + font-weight: bold; + border-bottom: 2px solid green; +} + +.popup input { + border: 1px solid #999; + background: #fff; + margin: 0; + padding: 5px; + outline: none; + color: #333; +} + +.popup input[type='text']:hover, +.popup input[type='text']:active, +.popup input[type='text']:focus { + border-color: green; +} + +.popup input[type='submit'] { + padding: 5px 10px; + background: #999; + color: #ddd; + text-transform: uppercase; + font-size: 0.9em; + font-weight: bold; +} + +.popup input[type='submit']:hover, +.popup input[type='submit']:focus, +.popup input[type='submit']:active { + background: #aaa; + cursor: pointer; +} + +.changeFont { + padding: 10px; +} + +.changeFont a { + display: block; + text-decoration: none; + padding: 3px; + color: #333; +} + +.changeFont a:hover { + background: #ccc; +} + +.highlightPopup { + padding: 10px; + text-align: center; +} + +.highlightPopup input[type='text'] { + display: block; + width: 215px; + text-align: left; + margin-top: 5px; +} + +.highlightPopup input.highlightColor { + background-color: #ffff00; +} + +.highlightPopup input.highlightTermSubmit { + margin-top: 5px; +} + +/* ADMIN CONTEXT MENU */ + +.contextMenu { + background-color: #ddd; + position: fixed; + margin: 2px; + width: 150px; +} + +.contextMenu a { + display: block; + padding: 2px 5px; + text-decoration: none; + color: #333; +} + +.contextMenu a:hover { + background-color: #ccc; +} + +/* ADMIN FILTER MESSAGES MENU */ + +.filterMessages { + padding: 5px; +} + +.filterMessages div { + padding: 2px 0; +} + +.filterMessages input { +} + +.filterMessages label { +} + +.icon-stack { + height: 1em; + line-height: 1em; + width: 1em; + vertical-align: middle; + margin-top: -2px; +} + +/***************************************** + * + * OUTPUT ACTUALLY RELATED TO MESSAGES + * + ******************************************/ + +/* MOTD */ + +.motd { + color: #638500; + font-family: Verdana, sans-serif; + white-space: normal; +} + +.motd h1, +.motd h2, +.motd h3, +.motd h4, +.motd h5, +.motd h6 { + color: #638500; + text-decoration: underline; +} + +.motd a, +.motd a:link, +.motd a:visited, +.motd a:active, +.motd a:hover { + color: #638500; +} + +/* ADD HERE FOR BOLD */ + +.bold, +.name, +.prefix, +.ooc, +.looc, +.adminooc, +.admin, +.medal, +.yell { + font-weight: bold; +} + +/* ADD HERE FOR ITALIC */ + +.italic, +.italics { + font-style: italic; +} + +/* OUTPUT COLORS */ + +.highlight { + background: yellow; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + color: #a4bad6; + font-family: Georgia, Verdana, sans-serif; +} + +h1.alert, +h2.alert { + color: #a4bad6; +} + +em { + font-style: normal; + font-weight: bold; +} + +.ooc { + color: #004ed8; + 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; +} + +.adminooc { + color: #3d5bc3; + font-weight: bold; +} + +.adminsay { + color: #ff4500; + font-weight: bold; +} + +.admin { + color: #5975da; + 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; +} + +.say, +.emote, +.infoplain, +.oocplain, +.warningplain { + color: #ffffff; +} + +.nif { +} + +.psay { + color: #e300e4; + font-style: italic; +} + +.pemote { + color: #e300e4; + font-style: italic; +} + +.deadsay { + color: #732fcd; +} + +.binarysay { + color: #1e90ff; +} + +.binarysay a { + color: #00ff00; +} + +.binarysay a:active, +.binarysay a:visited { + color: #88ff88; +} + +/* RADIO COLORS */ +/* IF YOU CHANGE THIS KEEP IT IN SYNC WITH TGUI CONSTANTS */ + +.radio { + color: #00a800; +} + +.sciradio { + color: #993399; +} + +.comradio { + color: #395a9a; +} + +.secradio { + color: #a30000; +} + +.medradio { + color: #008160; +} + +.engradio { + color: #a66300; +} + +.supradio { + color: #5f4519; +} + +.srvradio { + color: #6eaa2c; +} + +.expradio { + color: #555555; +} + +.syndradio { + color: #6d3f40; +} + +.gangradio { + color: #ac2ea1; +} + +.centradio { + color: #5c5c8a; +} + +.airadio { + color: #ff00ff; +} + +.redteamradio { + color: #ff4444 !important; +} + +.blueteamradio { + color: #3434fd !important; +} + +.greenteamradio { + color: #34fd34 !important; +} + +.yellowteamradio { + color: #fdfd34 !important; +} + +.yell { + font-weight: bold; +} + +.alert { + color: #ff0000; +} + +.valert { + color: #d82020; +} + +.userdanger { + color: #c51e1e; + font-weight: bold; + font-size: 185%; +} + +.bolddanger { + color: #c51e1e; + font-weight: bold; +} + +.danger { + color: #c51e1e; +} + +.vdanger { + color: #c51e1e; +} + +.warning { + color: #c51e1e; + font-style: italic; +} + +.vwarning { + color: #c51e1e; + font-style: italic; +} + +.alertwarning { + color: #ff0000; + font-weight: bold; +} + +.boldwarning { + color: #c51e1e; + font-style: italic; + font-weight: bold; +} + +.announce { + color: #c51e1e; + font-weight: bold; +} + +.boldannounce { + color: #c51e1e; + font-weight: bold; +} + +.minorannounce { + color: #c51e1e; + font-weight: bold; + font-size: 185%; +} + +.minoralert { + color: #a4bad6; + font-size: 125%; +} + +.priorityannounce { + color: #a4bad6; + font-weight: bold; + font-size: 225%; +} + +.prioritytitle { + color: #6685f5; + font-weight: bold; + font-size: 185%; +} + +.priorityalert { + color: #c51e1e; + font-size: 140%; +} + +.greenannounce { + color: #059223; + font-weight: bold; +} + +.rose { + color: #ff5050; +} + +.info { + color: #6060c9; +} + +.notice { + color: #6060c9; +} + +.vnotice { + color: #6060c9; +} + +.tinynotice { + color: #6060c9; + font-size: 85%; +} + +.tinynoticeital { + color: #6060c9; + font-style: italic; + font-size: 85%; +} + +.smallnotice { + color: #6060c9; + font-size: 90%; +} + +.smallnoticeital { + color: #6060c9; + font-style: italic; + font-size: 90%; +} + +.bolditalic { + font-style: italic; + font-weight: bold; +} + +.boldnotice { + color: #6060c9; + font-weight: bold; +} + +.hear { + color: #6060c9; + font-style: italic; +} + +.adminnotice { + color: #6060c9; +} + +.adminhelp { + color: #ff0000; + font-weight: bold; +} + +.log_message { + color: #386aff; + font-weight: bold; +} + +.unconscious { + color: #a4bad6; + font-weight: bold; +} + +.suicide { + color: #ff5050; + font-style: italic; +} + +.green { + color: #44ff44; +} + +.grey { + color: #a9a9a9; +} + +.red { + color: #ff0000; +} + +.blue { + color: #6666ff; +} + +.nicegreen { + color: #059223; +} + +.boldnicegreen { + color: #059223; + font-weight: bold; +} + +.blob { + color: #ee4000; +} + +.blobannounce { + color: #556b2f; + font-weight: bold; + font-size: 185%; +} + +.cult { + color: #973e3b; +} + +.cultitalic { + color: #973e3b; + font-style: italic; +} + +.cultbold { + color: #973e3b; + font-style: italic; + font-weight: bold; +} + +.cultboldtalic { + color: #973e3b; + font-weight: bold; + font-size: 185%; +} + +.cultlarge { + color: #973e3b; + font-weight: bold; + font-size: 185%; +} + +.narsie { + color: #973e3b; + font-weight: bold; + font-size: 925%; +} + +.narsiesmall { + color: #973e3b; + font-weight: bold; + font-size: 370%; +} + +.colossus { + color: #7f282a; + font-size: 310%; +} + +.hierophant { + color: #b441ee; + font-weight: bold; + font-style: italic; +} + +.hierophant_warning { + color: #c56bf1; + font-style: italic; +} + +.purple { + color: #9956d3; +} + +.holoparasite { + color: #88809c; +} + +.revennotice { + color: #c099e2; +} + +.revenboldnotice { + color: #c099e2; + font-weight: bold; +} + +.revenbignotice { + color: #c099e2; + font-weight: bold; + font-size: 185%; +} + +.revenminor { + color: #823abb; +} + +.revenwarning { + color: #760fbb; + font-style: italic; +} + +.revendanger { + color: #760fbb; + font-weight: bold; + font-size: 185%; +} + +.deconversion_message { + color: #a947ff; + font-size: 185%; + font-style: italic; +} + +.ghostalert { + color: #6600ff; + font-style: italic; + font-weight: bold; +} + +.alien { + color: #855d85; +} + +.noticealien { + color: #059223; +} + +.alertalien { + color: #059223; + font-weight: bold; +} + +.changeling { + color: #b000b1; + font-style: italic; +} + +.alertsyndie { + color: #ff0000; + font-size: 185%; + font-weight: bold; +} + +.spiderbroodmother { + color: #8800ff; + font-weight: bold; + font-size: 185%; +} + +.spiderbreacher { + color: #e8b670; + font-weight: bold; + font-size: 140%; +} + +.spiderscout { + color: #231d98; + font-weight: bold; + font-size: 120%; +} + +.interface { + color: #750e75; +} + +.sans { + font-family: 'Comic Sans MS', cursive, sans-serif; +} + +.papyrus { + font-family: 'Papyrus', cursive, sans-serif; +} + +.robot { + font-family: 'Courier New', cursive, sans-serif; +} + +.tape_recorder { + color: #ff0000; + font-family: 'Courier New', cursive, sans-serif; +} + +.command_headset { + font-weight: bold; + font-size: 160%; +} + +.small { + font-size: 60%; +} + +.big { + font-size: 185%; +} + +.reallybig { + font-size: 245%; +} + +.extremelybig { + font-size: 310%; +} + +.greentext { + color: #059223; + font-size: 185%; +} + +.redtext { + color: #c51e1e; + font-size: 185%; +} + +.clown { + color: #ff70c1; + font-size: 160%; + font-family: 'Comic Sans MS', cursive, sans-serif; + font-weight: bold; +} + +.singing { + font-family: 'Trebuchet MS', cursive, sans-serif; + font-style: italic; +} + +.his_grace { + color: #15d512; + font-family: 'Courier New', cursive, sans-serif; + font-style: italic; +} + +.hypnophrase { + color: #202020; + font-weight: bold; + animation: hypnocolor 1500ms infinite; + animation-direction: alternate; +} + +@keyframes hypnocolor { + 0% { + color: #202020; + } + + 25% { + color: #4b02ac; + } + + 50% { + color: #9f41f1; + } + + 75% { + color: #541c9c; + } + + 100% { + color: #7adbf3; + } +} + +.phobia { + color: #dd0000; + font-weight: bold; + animation: phobia 750ms infinite; +} + +@keyframes phobia { + 0% { + color: #f75a5a; + } + + 50% { + color: #dd0000; + } + + 100% { + color: #f75a5a; + } +} + +.icon { + height: 1em; + width: auto; +} + +.bigicon { + font-size: 2.5em; +} + +.hugeicon { + font-size: 5em; +} + +.memo { + color: #638500; + text-align: center; +} + +.memoedit { + text-align: center; + font-size: 125%; +} + +.abductor { + color: #c204c2; + font-style: italic; +} + +.mind_control { + color: #df3da9; + font-size: 100%; + font-weight: bold; + font-style: italic; +} + +.slime { + color: #00ced1; +} + +.drone { + color: #848482; +} + +.monkey { + color: #975032; +} + +.swarmer { + color: #2c75ff; +} + +.resonate { + color: #298f85; +} + +.upside_down { + display: inline; + -moz-transform: scale(-1, -1); + -webkit-transform: scale(-1, -1); + -o-transform: scale(-1, -1); + -ms-transform: scale(-1, -1); + transform: scale(-1, -1); +} + +.connectionClosed, +.fatalError { + background: red; + color: white; + padding: 5px; +} + +.connectionClosed.restored { + background: green; +} + +.internal.boldnshit { + color: #3d5bc3; + font-weight: bold; +} + +/* HELPER CLASSES */ + +.text-normal { + font-weight: normal; + font-style: normal; +} + +.hidden { + display: none; + visibility: hidden; +} + +.ml-1 { + margin-left: 1em; +} + +.ml-2 { + margin-left: 2em; +} + +.ml-3 { + margin-left: 3em; +} + +.examine_block { + background: #1b1c1e; + border: 1px solid #a4bad6; + margin: 0.5em; + padding: 0.5em 0.75em; +} + +.tooltip { + font-style: italic; + border-bottom: 1px dashed #fff; +} + +$alert-stripe-colors: ( + 'default': #00283a, + 'green': #003d00, + 'blue': #00283a, + 'pink': #30001b, + 'yellow': #574a00, + 'orange': #593400, + 'red': #420000, + 'purple': #2c0030, + 'grey': #252525, +); + +$alert-stripe-alternate-colors: ( + 'default': #003045, + 'green': #004700, + 'blue': #003045, + 'pink': #400025, + 'yellow': #4d4100, + 'orange': #6b4200, + 'red': #520000, + 'purple': #38003d, + 'grey': #292929, +); + +$alert-major-header-colors: ( + 'default': #33d5ff, + 'green': #00ff80, + 'blue': #33d5ff, + 'pink': #ff5297, + 'yellow': #fff4e0, + 'orange': #feefe7, + 'red': #ff5297, + 'purple': #c7a1f7, + 'grey': #ff5297, +); + +$alert-subheader-header-colors: ( + 'default': #ff5297, + 'green': #ff85b5, + 'blue': #ff5297, + 'pink': #33d5ff, + 'yellow': #33d5ff, + 'orange': #33d5ff, + 'red': #33d5ff, + 'purple': #33d5ff, + 'grey': #33d5ff, +); + +$border-width: 4; + +$border-width-px: $border-width * 1px; + +.major_announcement_title { + font-size: 175%; + padding: 0rem 0.5rem; + line-height: 100%; + text-align: left; + text-decoration: none; + width: 100%; +} + +.subheader_announcement_text { + font-weight: bold; + padding: 0 0.5rem; + padding-top: 0.25rem; + line-height: 100%; + width: 100%; + height: 100%; + text-align: left; + font-size: 125%; +} + +.major_announcement_text { + color: #eaeaea; + background-color: #131313; + font-weight: bold; + font-size: 100%; + text-align: left; + padding: 0.5rem 0.5rem; + width: 100%; + height: 100%; +} + +.minor_announcement_title { + font-weight: bold; + padding: 0 0.5rem; + padding-top: 0; + line-height: 100%; + width: 100%; + height: 100%; + text-align: left; + font-size: 150%; +} + +.minor_announcement_text { + background-color: #202020; + color: #eaeaea; + padding: 0.5rem 0.5rem; + text-align: left; + font-size: 100%; +} + +.announcement_header { + padding: 0.5rem 0; + display: flex; + flex-direction: column; +} + +@each $color-name, $color-value in $alert-stripe-colors { + .chat_alert_#{$color-name} { + color: #ffffff; + padding: 0.5rem 0.5rem; + box-shadow: none; + font-weight: bold; + margin: 1rem 0 1rem 0; + padding: 0; + display: flex; + flex-direction: column; + border-image: repeating-linear-gradient( + -45deg, + map.get($alert-stripe-alternate-colors, $color-name), + map.get($alert-stripe-alternate-colors, $color-name) 10px, + $color-value 10px, + $color-value 20px + ); + border-image-slice: $border-width fill; + border-width: $border-width-px; + border-image-width: $border-width-px; + border-image-outset: 0 0 0 0; + border-image-repeat: repeat repeat; + border-style: solid; + } + + .chat_alert_#{$color-name} .major_announcement_title { + color: map.get($alert-major-header-colors, $color-name); + } + + .chat_alert_#{$color-name} .minor_announcement_title { + color: map.get($alert-major-header-colors, $color-name); + } + + .chat_alert_#{$color-name} .subheader_announcement_text { + color: map.get($alert-subheader-header-colors, $color-name); + } + + .chat_alert_#{$color-name} .minor_announcement_text { + background-color: darken(map.get($alert-stripe-colors, $color-name), 5); + } + + .chat_alert_#{$color-name} .major_announcement_text { + 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; +} diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss new file mode 100644 index 0000000000..7d7d8a0e41 --- /dev/null +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss @@ -0,0 +1,1374 @@ +/** + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + +@use 'sass:map'; +@use 'sass:color'; + +html, +body { + padding: 0; + margin: 0; + height: 100%; + color: #000000; +} + +body { + background: #fff; + font-family: Verdana, sans-serif; + font-size: 13px; + line-height: 1.2; + overflow-x: hidden; + overflow-y: scroll; + word-wrap: break-word; +} + +em { + font-style: normal; + font-weight: bold; +} + +img { + margin: 0; + padding: 0; + line-height: 1; + -ms-interpolation-mode: nearest-neighbor; + image-rendering: pixelated; +} + +img.icon { + height: 1em; + min-height: 16px; + width: auto; + vertical-align: bottom; +} + +a { + color: #0000ff; +} + +a.visited { + color: #ff00ff; +} + +a:visited { + color: #ff00ff; +} + +a.popt { + text-decoration: none; +} + +/* POPUPS */ + +.popup { + position: fixed; + top: 50%; + left: 50%; + background: #ddd; +} + +.popup .close { + position: absolute; + background: #aaa; + top: 0; + right: 0; + color: #333; + text-decoration: none; + z-index: 2; + padding: 0 10px; + height: 30px; + line-height: 30px; +} + +.popup .close:hover { + background: #999; +} + +.popup .head { + background: #999; + color: #ddd; + padding: 0 10px; + height: 30px; + line-height: 30px; + text-transform: uppercase; + font-size: 0.9em; + font-weight: bold; + border-bottom: 2px solid green; +} + +.popup input { + border: 1px solid #999; + background: #fff; + margin: 0; + padding: 5px; + outline: none; + color: #333; +} + +.popup input[type='text']:hover, +.popup input[type='text']:active, +.popup input[type='text']:focus { + border-color: green; +} + +.popup input[type='submit'] { + padding: 5px 10px; + background: #999; + color: #ddd; + text-transform: uppercase; + font-size: 0.9em; + font-weight: bold; +} + +.popup input[type='submit']:hover, +.popup input[type='submit']:focus, +.popup input[type='submit']:active { + background: #aaa; + cursor: pointer; +} + +.changeFont { + padding: 10px; +} + +.changeFont a { + display: block; + text-decoration: none; + padding: 3px; + color: #333; +} + +.changeFont a:hover { + background: #ccc; +} + +.highlightPopup { + padding: 10px; + text-align: center; +} + +.highlightPopup input[type='text'] { + display: block; + width: 215px; + text-align: left; + margin-top: 5px; +} + +.highlightPopup input.highlightColor { + background-color: #ffff00; +} + +.highlightPopup input.highlightTermSubmit { + margin-top: 5px; +} + +/* ADMIN CONTEXT MENU */ + +.contextMenu { + background-color: #ddd; + position: fixed; + margin: 2px; + width: 150px; +} + +.contextMenu a { + display: block; + padding: 2px 5px; + text-decoration: none; + color: #333; +} + +.contextMenu a:hover { + background-color: #ccc; +} + +/* ADMIN FILTER MESSAGES MENU */ + +.filterMessages { + padding: 5px; +} + +.filterMessages div { + padding: 2px 0; +} + +.filterMessages input { +} + +.filterMessages label { +} + +.icon-stack { + height: 1em; + line-height: 1em; + width: 1em; + vertical-align: middle; + margin-top: -2px; +} + +/***************************************** + * + * OUTPUT ACTUALLY RELATED TO MESSAGES + * + ******************************************/ + +/* MOTD */ + +.motd { + color: #638500; + font-family: Verdana, sans-serif; + white-space: normal; +} + +.motd h1, +.motd h2, +.motd h3, +.motd h4, +.motd h5, +.motd h6 { + color: #638500; + text-decoration: underline; +} + +.motd a, +.motd a:link, +.motd a:visited, +.motd a:active, +.motd a:hover { + color: #638500; +} + +/* ADD HERE FOR BOLD */ + +.bold, +.name, +.prefix, +.ooc, +.looc, +.adminooc, +.admin, +.medal, +.yell { + font-weight: bold; +} + +/* ADD HERE FOR ITALIC */ + +.italic, +.italics { + font-style: italic; +} + +/* OUTPUT COLORS */ + +.highlight { + background: yellow; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + color: #0000ff; + font-family: Georgia, Verdana, sans-serif; +} + +h1.alert, +h2.alert { + color: #000000; +} + +em { + font-style: normal; + font-weight: bold; +} + +.ooc { + color: #002eb8; + 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; +} + +.adminooc { + color: #700038; + font-weight: bold; +} + +.adminsay { + color: #ff4500; + font-weight: bold; +} + +.admin { + color: #4473ff; + 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; +} + +.say, +.emote, +.infoplain, +.oocplain, +.warningplain { + color: #ffffff; +} + +.nif { +} + +.psay { + color: #800080; + font-style: italic; +} + +.pemote { + color: #800080; + font-style: italic; +} + +.deadsay { + color: #530fad; +} + +.binarysay { + color: #20c20e; + background-color: #000000; + display: block; +} + +.binarysay a { + color: #00ff00; +} + +.binarysay a:active, +.binarysay a:visited { + color: #88ff88; +} + +.radio { + color: #008000; +} + +.sciradio { + color: #993399; +} + +.comradio { + color: #193a7a; +} + +.secradio { + color: #a30000; +} + +.medradio { + color: #008160; +} + +.engradio { + color: #a66300; +} + +.supradio { + color: #5f4519; +} + +.srvradio { + color: #6eaa2c; +} + +.expradio { + color: #555555; +} + +.syndradio { + color: #6d3f40; +} + +.gangradio { + color: #ac2ea1; +} + +.centradio { + color: #5c5c8a; +} + +.airadio { + color: #ff00ff; +} + +.redteamradio { + color: #ff0000 !important; +} + +.blueteamradio { + color: #0000ff !important; +} + +.greenteamradio { + color: #00ff00 !important; +} + +.yellowteamradio { + color: #d1ba22 !important; +} + +.yell { + font-weight: bold; +} + +.alert { + color: #ff0000; +} + +.valert { + color: #ff0000; +} + +h1.alert, +h2.alert { + color: #000000; +} + +.userdanger { + color: #ff0000; + font-weight: bold; + font-size: 185%; +} + +.bolddanger { + color: #ff0000; + font-weight: bold; +} + +.danger { + color: #ff0000; +} + +.vdanger { + color: #ff0000; +} + +.tinydanger { + color: #ff0000; + font-size: 85%; +} + +.smalldanger { + color: #ff0000; + font-size: 90%; +} + +.warning { + color: #ff0000; + font-style: italic; +} + +.vwarning { + color: #ff0000; + font-style: italic; +} + +.alertwarning { + color: #ff0000; + font-weight: bold; +} + +.boldwarning { + color: #ff0000; + font-style: italic; + font-weight: bold; +} + +.announce { + color: #228b22; + font-weight: bold; +} + +.boldannounce { + color: #ff0000; + font-weight: bold; +} + +.minorannounce { + color: #ff0000; + font-weight: bold; + font-size: 185%; +} + +.minoralert { + color: #000000; + font-size: 125%; +} + +.priorityannounce { + color: #000000; + font-weight: bold; + font-size: 225%; +} + +.prioritytitle { + color: #0000ff; + font-weight: bold; + font-size: 185%; +} + +.priorityalert { + color: #ff0000; + font-size: 140%; +} + +.greenannounce { + color: #00ff00; + font-weight: bold; +} + +.rose { + color: #ff5050; +} + +.info { + color: #0000cc; +} + +.notice { + color: #000099; +} + +.vnotice { + color: #000099; +} + +.tinynotice { + color: #000099; + font-size: 85%; +} + +.tinynoticeital { + color: #000099; + font-style: italic; + font-size: 85%; +} + +.smallnotice { + color: #000099; + font-size: 90%; +} + +.smallnoticeital { + color: #000099; + font-style: italic; + font-size: 90%; +} + +.boldnotice { + color: #000099; + font-weight: bold; +} + +.hear { + color: #000099; + font-style: italic; +} + +.adminnotice { + color: #0000ff; +} + +.adminhelp { + color: #ff0000; + font-weight: bold; +} + +.log_message { + color: #386aff; + font-weight: bold; +} + +.unconscious { + color: #0000ff; + font-weight: bold; +} + +.suicide { + color: #ff5050; + font-style: italic; +} + +.green { + color: #03ff39; +} + +.grey { + color: #838383; +} + +.red { + color: #ff0000; +} + +.blue { + color: #0000ff; +} + +.nicegreen { + color: #14a833; +} + +.boldnicegreen { + color: #14a833; + font-weight: bold; +} + +.cult { + color: #973e3b; +} + +.cultitalic { + color: #973e3b; + font-style: italic; +} + +.cultbold { + color: #973e3b; + font-style: italic; + font-weight: bold; +} + +.cultboldtalic { + color: #973e3b; + font-weight: bold; + font-size: 185%; +} + +.cultlarge { + color: #973e3b; + font-weight: bold; + font-size: 185%; +} + +.blob { + color: #ee4000; +} + +.blobannounce { + color: #323f1c; + font-weight: bold; + font-size: 185%; +} + +.narsie { + color: #973e3b; + font-weight: bold; + font-size: 925%; +} + +.narsiesmall { + color: #973e3b; + font-weight: bold; + font-size: 370%; +} + +.colossus { + color: #7f282a; + font-size: 310%; +} + +.hierophant { + color: #660099; + font-weight: bold; + font-style: italic; +} + +.hierophant_warning { + color: #660099; + font-style: italic; +} + +.purple { + color: #5e2d79; +} + +.holoparasite { + color: #35333a; +} + +.revennotice { + color: #1d2953; +} + +.revenboldnotice { + color: #1d2953; + font-weight: bold; +} + +.revenbignotice { + color: #1d2953; + font-weight: bold; + font-size: 185%; +} + +.revenminor { + color: #823abb; +} + +.revenwarning { + color: #760fbb; + font-style: italic; +} + +.revendanger { + color: #760fbb; + font-weight: bold; + font-size: 185%; +} + +.deconversion_message { + color: #5000a0; + font-size: 185%; + font-style: italic; +} + +.ghostalert { + color: #5c00e6; + font-style: italic; + font-weight: bold; +} + +.alien { + color: #543354; +} + +.noticealien { + color: #00c000; +} + +.alertalien { + color: #00c000; + font-weight: bold; +} + +.changeling { + color: #800080; + font-style: italic; +} + +.alertsyndie { + color: #ff0000; + font-size: 185%; + font-weight: bold; +} + +.spiderbroodmother { + color: #4d004d; + font-weight: bold; + font-size: 185%; +} + +.spiderbreacher { + color: #804b02; + font-weight: bold; + font-size: 140%; +} + +.spiderscout { + color: #0c0674; + font-weight: bold; + font-size: 120%; +} + +.interface { + color: #330033; +} + +.sans { + font-family: 'Comic Sans MS', cursive, sans-serif; +} + +.papyrus { + font-family: 'Papyrus', cursive, sans-serif; +} + +.robot { + font-family: 'Courier New', cursive, sans-serif; +} + +.tape_recorder { + color: #800000; + font-family: 'Courier New', cursive, sans-serif; +} + +.command_headset { + font-weight: bold; + font-size: 160%; +} + +.small { + font-size: 60%; +} + +.big { + font-size: 185%; +} + +.reallybig { + font-size: 245%; +} + +.extremelybig { + font-size: 310%; +} + +.greentext { + color: #00ff00; + font-size: 185%; +} + +.redtext { + color: #ff0000; + font-size: 185%; +} + +.clown { + color: #ff69bf; + font-size: 160%; + font-family: 'Comic Sans MS', cursive, sans-serif; + font-weight: bold; +} + +.singing { + font-family: 'Trebuchet MS', cursive, sans-serif; + font-style: italic; +} + +.his_grace { + color: #15d512; + font-family: 'Courier New', cursive, sans-serif; + font-style: italic; +} + +.hypnophrase { + color: #0d0d0d; + font-weight: bold; + animation: hypnocolor 1500ms infinite; + animation-direction: alternate; +} + +@keyframes hypnocolor { + 0% { + color: #0d0d0d; + } + + 25% { + color: #410194; + } + + 50% { + color: #7f17d8; + } + + 75% { + color: #410194; + } + + 100% { + color: #3bb5d3; + } +} + +.phobia { + color: #dd0000; + font-weight: bold; + animation: phobia 750ms infinite; +} + +@keyframes phobia { + 0% { + color: #0d0d0d; + } + + 50% { + color: #dd0000; + } + + 100% { + color: #0d0d0d; + } +} + +.icon { + height: 1em; + width: auto; +} + +.bigicon { + font-size: 2.5em; +} + +.hugeicon { + font-size: 5em; +} + +.memo { + color: #638500; + text-align: center; +} + +.memoedit { + text-align: center; + font-size: 125%; +} + +.abductor { + color: #800080; + font-style: italic; +} + +.mind_control { + color: #a00d6f; + font-size: 100%; + font-weight: bold; + font-style: italic; +} + +.slime { + color: #00ced1; +} + +.drone { + color: #848482; +} + +.monkey { + color: #975032; +} + +.swarmer { + color: #2c75ff; +} + +.resonate { + color: #298f85; +} + +.upside_down { + display: inline; + -moz-transform: scale(-1, -1); + -webkit-transform: scale(-1, -1); + -o-transform: scale(-1, -1); + -ms-transform: scale(-1, -1); + transform: scale(-1, -1); +} + +.connectionClosed, +.fatalError { + background: red; + color: white; + padding: 5px; +} + +.connectionClosed.restored { + background: green; +} + +.internal.boldnshit { + color: blue; + font-weight: bold; +} + +/* HELPER CLASSES */ + +.text-normal { + font-weight: normal; + font-style: normal; +} + +.hidden { + display: none; + visibility: hidden; +} + +.ml-1 { + margin-left: 1em; +} + +.ml-2 { + margin-left: 2em; +} + +.ml-3 { + margin-left: 3em; +} + +.examine_block { + background: #f2f7fa; + border: 1px solid #111a27; + margin: 0.5em; + padding: 0.5em 0.75em; +} + +.tooltip { + font-style: italic; + border-bottom: 1px dashed #000; +} + +$alert-stripe-colors: ( + 'default': #b3bfff, + 'green': #adffad, + 'blue': #b3bfff, + 'pink': #ffb3df, + 'yellow': #fff3b3, + 'orange': #ffe2b3, + 'red': #ffb3b3, + 'purple': #fac2ff, + 'grey': #e3e3e3, +); + +$alert-stripe-alternate-colors: ( + 'default': #bdc8ff, + 'green': #bdffbd, + 'blue': #bdc8ff, + 'pink': #ffc2e5, + 'yellow': #fff5c2, + 'orange': #ffe8c2, + 'red': #ffc2c2, + 'purple': #fbd1ff, + 'grey': #ebebeb, +); + +$alert-major-header-colors: ( + 'default': #003061, + 'green': #005229, + 'blue': #003061, + 'pink': #800033, + 'yellow': #754900, + 'orange': #823208, + 'red': #800029, + 'purple': #450d8c, + 'grey': #800033, +); + +$alert-subheader-header-colors: ( + 'default': #6b0020, + 'green': #6b0020, + 'blue': #6b0020, + 'pink': #002c85, + 'yellow': #002c85, + 'orange': #002c85, + 'red': #002c85, + 'purple': #002c85, + 'grey': #002c85, +); + +$border-width: 4; + +$border-width-px: $border-width * 1px; + +.major_announcement_title { + font-size: 175%; + padding: 0rem 0.5rem; + line-height: 100%; + text-align: left; + text-decoration: none; + width: 100%; +} + +.subheader_announcement_text { + font-weight: bold; + padding: 0 0.5rem; + padding-top: 0.25rem; + line-height: 100%; + width: 100%; + height: 100%; + text-align: left; + font-size: 125%; +} + +.major_announcement_text { + color: #131313; + background-color: #eaeaea; + font-weight: bold; + font-size: 100%; + text-align: left; + padding: 0.5rem 0.5rem; + width: 100%; + height: 100%; +} + +.minor_announcement_title { + font-weight: bold; + padding: 0 0.5rem; + padding-top: 0; + line-height: 100%; + width: 100%; + height: 100%; + text-align: left; + font-size: 150%; +} + +.minor_announcement_text { + background-color: #eaeaea; + color: #202020; + padding: 0.5rem 0.5rem; + text-align: left; + font-size: 100%; +} + +.announcement_header { + padding: 0.5rem 0; + display: flex; + flex-direction: column; +} + +@each $color-name, $color-value in $alert-stripe-colors { + .chat_alert_#{$color-name} { + color: #ffffff; + padding: 0.5rem 0.5rem; + box-shadow: none; + font-weight: bold; + margin: 1rem 0 1rem 0; + padding: 0; + display: flex; + flex-direction: column; + border-image: repeating-linear-gradient( + -45deg, + map.get($alert-stripe-alternate-colors, $color-name), + map.get($alert-stripe-alternate-colors, $color-name) 10px, + $color-value 10px, + $color-value 20px + ); + border-image-slice: $border-width fill; + border-width: $border-width-px; + border-image-width: $border-width-px; + border-image-outset: 0 0 0 0; + border-image-repeat: repeat repeat; + border-style: solid; + } + + .chat_alert_#{$color-name} .major_announcement_title { + color: map.get($alert-major-header-colors, $color-name); + } + + .chat_alert_#{$color-name} .minor_announcement_title { + color: map.get($alert-major-header-colors, $color-name); + } + + .chat_alert_#{$color-name} .subheader_announcement_text { + color: map.get($alert-subheader-header-colors, $color-name); + } + + .chat_alert_#{$color-name} .minor_announcement_text { + background-color: lighten( + map.get($alert-stripe-alternate-colors, $color-name), + 5 + ); + } + + .chat_alert_#{$color-name} .major_announcement_text { + background-color: lighten( + map.get($alert-stripe-alternate-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: #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; +} diff --git a/tgui/packages/tgui-panel/styles/themes/vchatdark.scss b/tgui/packages/tgui-panel/styles/themes/vchatdark.scss new file mode 100644 index 0000000000..ec3afa79fc --- /dev/null +++ b/tgui/packages/tgui-panel/styles/themes/vchatdark.scss @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + +@use 'sass:color'; +@use 'sass:meta'; + +// CHOMPEdit Start - tgui_ch +@use '~tgui_ch/styles/colors.scss'; +@use '~tgui_ch/styles/base.scss'; + +// A fat warning to anyone who wants to use this: this only half works. +// It was made almost purely for the nuke ui, and requires a good amount of manual hacks to get it working as intended. +.theme-vchatdark { + // Atomic classes + @include meta.load-css('~tgui_ch/styles/atomic/color.scss'); + + // Components + @include meta.load-css('~tgui_ch/styles/components/Tabs.scss'); + @include meta.load-css('~tgui_ch/styles/components/Section.scss'); + @include meta.load-css('~tgui_ch/styles/components/Button.scss'); + @include meta.load-css('~tgui_ch/styles/components/Input.scss'); + @include meta.load-css('~tgui_ch/styles/components/NumberInput.scss'); + @include meta.load-css('~tgui_ch/styles/components/TextArea.scss'); + @include meta.load-css('~tgui_ch/styles/components/Knob.scss'); + @include meta.load-css('~tgui_ch/styles/components/Slider.scss'); + @include meta.load-css('~tgui_ch/styles/components/ProgressBar.scss'); + + // Components specific to tgui-panel + @include meta.load-css('../components/Chat.scss'); + + // Layouts + @include meta.load-css('~tgui_ch/styles/layouts/Layout.scss'); + @include meta.load-css('~tgui_ch/styles/layouts/Window.scss'); + @include meta.load-css('~tgui_ch/styles/layouts/TitleBar.scss'); + + // tgchat styles + @include meta.load-css('../tgchat/chat-vchatdark.scss'); +} +// CHOMPEdit End diff --git a/tgui/packages/tgui-panel/styles/themes/vchatlight.scss b/tgui/packages/tgui-panel/styles/themes/vchatlight.scss new file mode 100644 index 0000000000..561f942d44 --- /dev/null +++ b/tgui/packages/tgui-panel/styles/themes/vchatlight.scss @@ -0,0 +1,89 @@ +/** + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + +@use 'sass:color'; +@use 'sass:meta'; + +// CHOMPEdit Start - tgui_ch +@use '~tgui_ch/styles/colors.scss' with ( + $primary: #ffffff, + $bg-lightness: -25%, + $fg-lightness: -10%, + $label: #3b3b3b, + // Makes button look actually grey due to weird maths. + $grey: #ffffff, + // Commenting out color maps will adjust all colors based on the lightness + // settings above, but will add extra 10KB to the theme. + // $fg-map-keys: (), + // $bg-map-keys: (), + ); +@use '~tgui_ch/styles/base.scss' with ( + $color-fg: #000000, + $color-bg: #eeeeee, + $color-bg-section: #ffffff, + $color-bg-grad-spread: 0%, + ); + +// A fat warning to anyone who wants to use this: this only half works. +// It was made almost purely for the nuke ui, and requires a good amount of manual hacks to get it working as intended. +.theme-vchatlight { + // Atomic classes + @include meta.load-css('~tgui_ch/styles/atomic/color.scss'); + + // Components + @include meta.load-css( + '~tgui_ch/styles/components/Tabs.scss', + $with: ('text-color': rgba(0, 0, 0, 0.5), 'color-default': rgba(0, 0, 0, 1)) + ); + @include meta.load-css('~tgui_ch/styles/components/Section.scss'); + @include meta.load-css( + '~tgui_ch/styles/components/Button.scss', + $with: ( + 'color-default': #bbbbbb, + 'color-disabled': #363636, + 'color-selected': #0668b8, + 'color-caution': #be6209, + 'color-danger': #9a9d00, + 'color-transparent-text': rgba(0, 0, 0, 0.5) + ) + ); + @include meta.load-css( + '~tgui_ch/styles/components/Input.scss', + $with: ( + 'border-color': colors.fg(colors.$label), + 'background-color': #ffffff + ) + ); + @include meta.load-css('~tgui_ch/styles/components/NumberInput.scss'); + @include meta.load-css('~tgui_ch/styles/components/TextArea.scss'); + @include meta.load-css('~tgui_ch/styles/components/Knob.scss'); + @include meta.load-css('~tgui_ch/styles/components/Slider.scss'); + @include meta.load-css('~tgui_ch/styles/components/ProgressBar.scss'); + + // Components specific to tgui-panel + @include meta.load-css( + '../components/Chat.scss', + $with: ('text-color': #000000) + ); + + // Layouts + @include meta.load-css( + '~tgui_ch/styles/layouts/Layout.scss', + $with: ('scrollbar-color-multiplier': -1) + ); + @include meta.load-css('~tgui_ch/styles/layouts/Window.scss'); + @include meta.load-css( + '~tgui_ch/styles/layouts/TitleBar.scss', + $with: ( + 'text-color': rgba(0, 0, 0, 0.75), + 'background-color': base.$color-bg, + 'shadow-color-core': rgba(0, 0, 0, 0.25) + ) + ); + + // tgchat styles + @include meta.load-css('../tgchat/chat-vchatlight.scss'); +} +// CHOMPEdit End diff --git a/tgui/packages/tgui-panel/themes.js b/tgui/packages/tgui-panel/themes.js index 08f70714e8..054d2d9351 100644 --- a/tgui/packages/tgui-panel/themes.js +++ b/tgui/packages/tgui-panel/themes.js @@ -4,7 +4,7 @@ * @license MIT */ -export const THEMES = ['light', 'dark']; +export const THEMES = ['light', 'dark', 'vchatlight', 'vchatdark']; const COLOR_DARK_BG = '#202020'; const COLOR_DARK_BG_DARKER = '#171717'; @@ -31,7 +31,7 @@ export const setClientTheme = (name) => { Byond.command(`.output statbrowser:set_theme ${name}`); }, 1500); - if (name === 'light') { + if (name === 'light' || name === 'vchatlight') { return Byond.winset({ // Main windows 'infowindow.background-color': 'none', @@ -101,7 +101,7 @@ export const setClientTheme = (name) => { 'forumb.text-color': '#000000', }); } - if (name === 'dark') { + if (name === 'dark' || name === 'vchatdark') { Byond.winset({ // Main windows 'infowindow.background-color': COLOR_DARK_BG, diff --git a/tgui/packages/tgui/interfaces/VorePanel.js b/tgui/packages/tgui/interfaces/VorePanel.js index 43fb76376d..a72a1731fe 100644 --- a/tgui/packages/tgui/interfaces/VorePanel.js +++ b/tgui/packages/tgui/interfaces/VorePanel.js @@ -536,6 +536,162 @@ const VoreSelectedBellyDescriptions = (props, context) => { content="Absorbed Struggle Message (inside)" /> + +