From 8f2fab79d3a9b75fbd105a323f8cd2f236f26dc9 Mon Sep 17 00:00:00 2001 From: JJRcop Date: Wed, 17 Dec 2014 00:10:51 -0500 Subject: [PATCH 1/5] Adds emoji to OOC chat. --- code/controllers/configuration.dm | 3 +++ code/game/verbs/ooc.dm | 3 +++ code/modules/emoji/emoji_parse.dm | 36 ++++++++++++++++++++++++++++ config/game_options.txt | 4 ++++ html/changelogs/JJRcop-OOCemoji.yml | 4 ++++ icons/emoji.dmi | Bin 0 -> 2397 bytes tgstation.dme | 1 + 7 files changed, 51 insertions(+) create mode 100644 code/modules/emoji/emoji_parse.dm create mode 100644 html/changelogs/JJRcop-OOCemoji.yml create mode 100644 icons/emoji.dmi diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 0501caf3db1..29ca70e5acc 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -109,6 +109,7 @@ var/rename_cyborg = 0 var/ooc_during_round = 0 + var/ooc_emojis = 0 //Used for modifying movement speed for mobs. //Unversal modifiers @@ -300,6 +301,8 @@ config.rename_cyborg = 1 if("ooc_during_round") config.ooc_during_round = 1 + if("ooc_emojis") + config.ooc_emojis = 1 if("run_delay") config.run_speed = text2num(value) if("walk_delay") diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 2eb21269c60..441510c7823 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -43,6 +43,9 @@ if(prefs.toggles & MEMBER_PUBLIC) keyname = "[keyname]" + if(config.ooc_emojis) + msg = emoji_parse(msg) + for(var/client/C in clients) if(C.prefs.toggles & CHAT_OOC) if(holder) diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm new file mode 100644 index 00000000000..f2d2055fd95 --- /dev/null +++ b/code/modules/emoji/emoji_parse.dm @@ -0,0 +1,36 @@ +var/list/emoji_text + +/proc/emoji_parse(text) + if(!emoji_text) + emoji_text = icon_states(icon('icons/emoji.dmi')) + var/list/allowed_characters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9") + var/textlen = 0 + var/parsed = "" + var/pos = 1 + var/char = "" + var/emoji = "" + textlen = length(text) + while(pos <= textlen) + char = copytext(text, pos, pos+1) + if(emoji) + if(lowertext(char) in allowed_characters) + emoji += char + else if(char == ":" && emoji != ":") + emoji = lowertext(copytext(emoji, 2)) + if(emoji in emoji_text) + parsed += "" + else + parsed += ":" + emoji + char + emoji = "" + else + parsed += (emoji + char) + emoji = "" + else if(char == ":") + emoji += ":" + else + parsed += char + pos++ + if(emoji) + parsed += emoji + return parsed + diff --git a/config/game_options.txt b/config/game_options.txt index 7f469d35001..fe8ec13eed0 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -27,6 +27,10 @@ REVIVAL_BRAIN_LIFE -1 #Comment this out if you want OOC to be automatically disabled during the round, it will be enabled during the lobby and after the round end results. OOC_DURING_ROUND +### OOC EMOJI ### +#Comment this out if you want to disable OOC emojis +OOC_EMOJIS + ### MOB MOVEMENT ### ## We suggest editing these variables ingame to find a good speed for your server. diff --git a/html/changelogs/JJRcop-OOCemoji.yml b/html/changelogs/JJRcop-OOCemoji.yml new file mode 100644 index 00000000000..fa65b93fb7e --- /dev/null +++ b/html/changelogs/JJRcop-OOCemoji.yml @@ -0,0 +1,4 @@ +author: JJRcop, Nienhaus +delete-after: True +changes: + - rscadd: "Adds emoji to OOC chat." \ No newline at end of file diff --git a/icons/emoji.dmi b/icons/emoji.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5128dc93d2589d1575c97652f3605fe18f9e78d5 GIT binary patch literal 2397 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 P00000NkvXXu0mjf*-T=h literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index b7a98f5f8bd..ca2ad60b43a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -852,6 +852,7 @@ #include "code\modules\detectivework\evidence.dm" #include "code\modules\detectivework\footprints_and_rag.dm" #include "code\modules\detectivework\scanner.dm" +#include "code\modules\emoji\emoji_parse.dm" #include "code\modules\events\alien_infestation.dm" #include "code\modules\events\anomaly.dm" #include "code\modules\events\anomaly_bluespace.dm" From 1f064e5312acaa34c6bc776510e8ad27f2a1ff3e Mon Sep 17 00:00:00 2001 From: JJRcop Date: Wed, 17 Dec 2014 00:41:18 -0500 Subject: [PATCH 2/5] Adds emoji to adminPMs as requested by supreme overlord scaredofshadows --- code/modules/admin/verbs/adminpm.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 038d9d88553..39b8899c4b2 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -68,6 +68,8 @@ msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) if(!msg) return + msg = emoji_parse(msg) + if(C.holder) if(holder) //both are admins C << "Admin PM from-[key_name(src, C, 1)]: [msg]" From 4755198a75c30421e42d5eea1bcf9420c8597750 Mon Sep 17 00:00:00 2001 From: JJRcop Date: Wed, 17 Dec 2014 10:19:35 -0500 Subject: [PATCH 3/5] Made emoji parsing much cheaper AdminPM now follows OOC_EMOJIS rule --- code/modules/admin/verbs/adminpm.dm | 3 +- code/modules/emoji/emoji_parse.dm | 44 +++++++++++++---------------- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 39b8899c4b2..d1bcd8456b4 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -68,7 +68,8 @@ msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) if(!msg) return - msg = emoji_parse(msg) + if(config.ooc_emojis) + msg = emoji_parse(msg) if(C.holder) if(holder) //both are admins diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm index f2d2055fd95..a804893bdaf 100644 --- a/code/modules/emoji/emoji_parse.dm +++ b/code/modules/emoji/emoji_parse.dm @@ -1,36 +1,30 @@ -var/list/emoji_text +var/list/emojis /proc/emoji_parse(text) - if(!emoji_text) - emoji_text = icon_states(icon('icons/emoji.dmi')) - var/list/allowed_characters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9") - var/textlen = 0 + if(!emojis) + emojis = icon_states(icon('icons/emoji.dmi')) var/parsed = "" var/pos = 1 - var/char = "" + var/search = 0 var/emoji = "" - textlen = length(text) - while(pos <= textlen) - char = copytext(text, pos, pos+1) - if(emoji) - if(lowertext(char) in allowed_characters) - emoji += char - else if(char == ":" && emoji != ":") - emoji = lowertext(copytext(emoji, 2)) - if(emoji in emoji_text) + while(1) + search = findtext(text, ":", pos) + parsed += copytext(text, pos, search) + if(search) + pos = search + search = findtext(text, ":", pos+1) + if(search) + emoji = lowertext(copytext(text, pos+1, search)) + if(emoji in emojis) parsed += "" + pos = search + 1 else - parsed += ":" + emoji + char + parsed += copytext(text, pos, search) + pos = search emoji = "" + continue else - parsed += (emoji + char) - emoji = "" - else if(char == ":") - emoji += ":" - else - parsed += char - pos++ - if(emoji) - parsed += emoji + parsed += copytext(text, pos, search) + break return parsed From fa18eaa1646441b406d9129c41b2fcd6a7685bb3 Mon Sep 17 00:00:00 2001 From: JJRcop Date: Wed, 17 Dec 2014 12:48:41 -0500 Subject: [PATCH 4/5] Renames game_options.txt OOC_EMOJIS to EMOJIS Moves config check into emoji_parse proc, so the config affects all emoji use --- code/controllers/configuration.dm | 6 +++--- code/game/verbs/ooc.dm | 3 +-- code/modules/admin/verbs/adminpm.dm | 3 +-- code/modules/emoji/emoji_parse.dm | 2 ++ config/game_options.txt | 6 +++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 29ca70e5acc..127acb23565 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -109,7 +109,7 @@ var/rename_cyborg = 0 var/ooc_during_round = 0 - var/ooc_emojis = 0 + var/emojis = 0 //Used for modifying movement speed for mobs. //Unversal modifiers @@ -301,8 +301,8 @@ config.rename_cyborg = 1 if("ooc_during_round") config.ooc_during_round = 1 - if("ooc_emojis") - config.ooc_emojis = 1 + if("emojis") + config.emojis = 1 if("run_delay") config.run_speed = text2num(value) if("walk_delay") diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 441510c7823..20e86957187 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -43,8 +43,7 @@ if(prefs.toggles & MEMBER_PUBLIC) keyname = "[keyname]" - if(config.ooc_emojis) - msg = emoji_parse(msg) + msg = emoji_parse(msg) for(var/client/C in clients) if(C.prefs.toggles & CHAT_OOC) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index d1bcd8456b4..39b8899c4b2 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -68,8 +68,7 @@ msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) if(!msg) return - if(config.ooc_emojis) - msg = emoji_parse(msg) + msg = emoji_parse(msg) if(C.holder) if(holder) //both are admins diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm index a804893bdaf..aab9947c89e 100644 --- a/code/modules/emoji/emoji_parse.dm +++ b/code/modules/emoji/emoji_parse.dm @@ -1,6 +1,8 @@ var/list/emojis /proc/emoji_parse(text) + if(!config.emojis) + return text if(!emojis) emojis = icon_states(icon('icons/emoji.dmi')) var/parsed = "" diff --git a/config/game_options.txt b/config/game_options.txt index fe8ec13eed0..00fad47a4de 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -27,9 +27,9 @@ REVIVAL_BRAIN_LIFE -1 #Comment this out if you want OOC to be automatically disabled during the round, it will be enabled during the lobby and after the round end results. OOC_DURING_ROUND -### OOC EMOJI ### -#Comment this out if you want to disable OOC emojis -OOC_EMOJIS +### EMOJI ### +#Comment this out if you want to disable emojis +EMOJIS ### MOB MOVEMENT ### From ed2c242b999ccb674ef7dcb8772b1c929cbf1749 Mon Sep 17 00:00:00 2001 From: JJRcop Date: Thu, 18 Dec 2014 22:36:50 -0500 Subject: [PATCH 5/5] Adds more emoji igloves by @paprka, revolver by @paprka, honkman, xeno --- icons/emoji.dmi | Bin 2397 -> 2794 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/emoji.dmi b/icons/emoji.dmi index 5128dc93d2589d1575c97652f3605fe18f9e78d5..a78a7e3df7961a224785d597ebbbada3516ac1e2 100644 GIT binary patch delta 2537 zcmV3nk?b>n`JyWdHJJ-Hoeemh5IL9%Fo*f3 zHTs+%Dp4qEk!YaDo{F)EHeEC`S~0WQu{vQmI$<|2S1mACE;`#NNJvP+!ooB(GzbR= z1WdSoUJ4dng*=qS&z*+@Q_BTk=rfuB3kwTEK|y!T{)XTG`^mEaW&b33_yElRR#sN& z^7jCLX8#ox6;HYKkzYwuR8|NG2qF>y?!2a`sjCze6lOOC6;*iTvYgzil*h=*IwA%m zA|fSjmlqcoI5;?AVPOE7{~IA0R8&;|RRF9*4o*%^@_!giOiWKtPf<}(Qc_YdFfdhA zR6agFN=iy@ZEbOGZg6gHZftDwnnb+PwbslK%qVx#J(Bdd+y5YO&t_<8lUf2E65(tO z|Nj6KKX4dRmO%S60RI4!djcMR0093uHa7p=-%d*XJ<4sODHEf z5D*YVUI0>3h&eeqQ*!_`NC0MLX6owd`1tr!Xe@aE0004WQchC&S{0lC;C;%Y+=K&Iy>0*<9 z%Dme^RFf=meZIIGn;XC-N0E9jZ@swWTlu+BF#3Tn*YN8mY^%4i#r(+qlM~Rai=@6!? zC$KopC{8Emr>AOSgZ7Y;rbm-BJr0UfQgE1(!s2uX`K0N`C=r_D3{}7sjiEM9(R65v zCId}>dz9$Vl*pj~)6`h3u|rcLhb99}dp&?yb0Z)JAWNG5`Km!OmjPCCnqi!R#dioR zS<|6p6_A`t#l~@R8kJ#ucI^lLPClnKb*j$Jw*>Xif7&!X!rPqsW1o@n&NNW)fy^vb znIXGnXJ>2ubEX3U0pMLH+2KSp=#i|f=teIIj4rLT%=jZ2(gp8bm!s!|K+k4LU zv7EA#1I&aaj{-k07cGX8J=ZrvJ){t-Ul;tVacO_;Q3ydI;j7L z@Zkuvz`v0CW5P!uAe3+=%EDEmfZ+K*6{fCK9xywfd{jVbDd$h>4>^>T%_-pk<+*Bq ziGt>TIz6UxC7NCFaYevCBWLbh!5;`txvX*yB|wSFbBQRRm-${H%;xqMfS~Vx4+K)8`J7Pi^SvIyz@I8;vO5Roa~IY?`g7ZW zJ_+U2qEAByXbB5K@-O0|>gwuHIP5222msZe6u4Shdj%}~?DH@IP*bD*BKp%yNWB%p zqAwONUb1A7+H`4cZLP}%8#ne}2uT0{i`v!@XZBaO|1PCG^v|*{m#<_w7gqFGZT;4IsY#NyNgICL zPR{W*?AZC!&!Ar#yu{zLYtt@&4E;b#=R81%QixVTF&?LIzEHnm9mn!w#>v zzTWHI+0cw?8XG+lWFUDO8x{YSq84s^GQjSwyD`8ezOZs(0Qm3O)5HNsDDq!D#ftD5l(AL(` zfonu6gk0m@^o5ms!bC(%gbCytY~Mfu(Es_rAH)PN_3(JO{vQzRQ5*QTqW}OQH{$=G z+Cz4tZHLxNbdMKOn1Ar#{?@}@FA9>_eGKSm?|@+h{#*VCZjK2|>K^Z5AaDuvq;}{& z>#tkCiJR_sn^k|D1Qz*!`oH=tpU-D-q?4&X=E&D|gc6R*%1-vB^BCw)yy+{!=R48` z{vaS!;fH-$mXE_agZ!pA;RkQBp6H`Lw(i0JNCL?+Jc}Pcd9uFPc9j04IOSI|@Sp0V zKk=p*oCE3q@sq_i8~sVq&kU$P)E|~E;2=UM2HBjI^nw4hpJd>0Ki#(ku&a*(e8ivT zAj|b-%JcZ?Za-w;@9rA_VOMZRJ~Eh?s!)~8p2s_nb)Wg`On2W0k+O=aB9G%Vg-(BW zcelSEw}FwA2Yw(x1_R*F9{3TtnFqrEU!lJN#&3$o5Je$E00000NkvXXu0mjfB$KV! delta 2133 zcmV-b2&(t$72OggiBL{Q4GJ0x0000DNk~Le0000`0000`2m=5B0J+Zsp8x;?i;*Q{ zk&GUZupyDuB$4|we+o633pbq&IGqqVmYLRH5$DWF@h&Ej` zGg>jT+OaxeI67fB*VorCS1mACF7op7I@>7uqAU5PHTs+%&z*<+$+MAPN$$L+FqdH4X#|5jF3>GJm#6%|jp^;1+<2nYxw5&$T7(mj&&x7+_9anELG zX{f2I6ciL@Hw6_{coaWy7*m$V$jUk*1~@i0BO)RtZkHPy8vy?RMn*<$ZEfY;tzcka z$Folt7Z);eJ-a?WKES}hVPRn#AsPQw0IWj}PEJltOiWKtPf<}(Qc_YdFfdhAR7y%p zZf$LGZf<=-QP}3Ol4(dLoza1LP8eDYZ9JS z)YR0FkdTsJdfxy500DGTPE!Ct=GbNc008ECR9JLGWpiV4X>fFDZ*Bkpc$|&X!D_=W z3y)mOwX*5W?yp##OatYJg79A}w2NW&Ju3)l3B^ zby$Gfu%N*FTQF4|7yYupt3+r`nOL8#3s`^fJj4e*{t5e*^jO7Vfczh;?djS)|LYyj za}M4YP@o6^00oXoL_t(oh3(jjTT^8m2k^sUT~6x)>wXzYS4u6C?w2hpyV%uI#=tGM z!D0|(LBX&gP~D&Sa+I6<1z$^)=UCcl`}F@*S!`QOq{%{H^lC58brB!I?{v<6WcRtuD_Lwffa zlq9W`+8|Noi^6ni8keWvBHUP?x2t z-L!^y97Yx_b&`1Pd|jTV_ELY)Q{iwpiWP8;(+8VR8*q)v6uwpkD1mVU_p-`dBy%pzw!@UOou40a?RR}!hwHq<)Gu|_j_Om zmzRWIXRdM*&6?kzo)-M>!F!zjopLV!id0oq$)6YEtX5T5S5r~vddJq>dPzN5g!PQS zH`A|w+^tExx8O$-<@HQ+y-TRQK3ED^u%;USNMH$UMnCfUrmhp#L$U*N?^e~+zFk{G zM=n!!IFI!Y#F`rUq&R<79VM)H8p{{Ay42Rz3Ji#UH35z7UX9g&cH~lZ;9@&=a@)!N znqb=XPS5(siT|bbZ|&M7U%tcT%)Gj~Wa7I__$~GCrQ#YI-milsZfI_Abd!+G&QzBg79i=O6r9|$dg`**V?we0eye^DDW{#z!qS@4e%S} zLF$E2B&(VAT3gp)us-mK4gRlJU<(Ko41T(y1%87p$n_VJ#+9eu2wofUkoXw{#4s~* z6PlU<`FVx*O`oG|`r=FcWk(0&;o}EAc6M$KGhkN>JF;><2-v-aq+6P|r-$=E4A?q* zHxm&??rOo2LH2+AVzIluy}b`!-SqhNbZlh3ejt0py%cN-c6Dvt8l)o+)DJM%3kCbO z^%1ZEAHNQPOMkx*4ofW}5MMR4!|kjGqA)l##B|uOzO9v?mnPiXi$L{-z5T0!0S+7- z93Dn9OA~{b+yfDhJi>%{+)jhw4GAm=H(hd%M7=oh?IC|~cxV_-Gk9CRP6g@A5VVI9 zkzUC{Zl;AxhP?IS5W9s}3D_3-;J=w5e00000 LNkvXXu0mjfzEu7X