title="Although you can't see this in 3D, try crossing your eyes or using a mirror!" >}}
## [Software Keyboard Implementation](https://github.com/citra-emu/citra/pull/3850) by [zhaowenlan1779](https://github.com/zhaowenlan1779) and [jroweboy](https://github.com/jroweboy)
For the longest time, many games were unplayable or needed workarounds on Citra
due to them needing the software keyboard applet. The reason being that whenever
they would try to open it, Citra didn't implement it, and so would simply tell
the game that the user entered "Citra" and tapped OK, without actually prompting.
But now, thanks to zhaowenlan1779 and jroweboy, it now has fully functional
software keyboard emulation!
Whenever a game requests it, Citra will pause the game and pull up a text box that
title="Now you can change your name to anything!" >}}
## Open Source System Archives ([#3977](https://github.com/citra-emu/citra/pull/3977), [#3881](https://github.com/citra-emu/citra/pull/3881)) by [B3n30](https://github.com/B3n30)
Many Nintendo 3DS games require the use of system archives, which contain things
like fonts, a bad word list, and assets for Miis. Because these are copyrighted,
Citra could not include them, and users had to dump a copy from their consoles,
which was a generally tedious and error-prone process.
Now, [B3n30](https://github.com/B3n30) has created open source alternative fonts
and a bad word list that can be used in games instead of the official archives.
And, because these are open source, they are now included with Citra. If a game
requires either archive, and you haven't dumped them yet, it'll automatically give
the game the alternative archives. This is a step forward to Citra becoming
a full-fledged HLE 3DS emulator.
## [Implement shadow map](https://github.com/citra-emu/citra/pull/3778) by [wwylele](https://github.com/wwylele)
Shadow mapping is a way to quickly apply shadows to 3D scenes. It first renders
the scene without any lighting, texture, or colour information, with a virtual
camera from where the light source begins. Then, from that rendering the depth
map is extracted. That is then applied as a texture to the darkened scene, making
areas of it directly visible from the light source appear more brightly lit.
The PICA200 (the GPU inside the 3DS) and OpenGL both implement this in different
ways, particularly in two important areas:
* The first is that PICA200 supports a variant called "soft shadows", where the
depth map is blurred before being applied to the scene. This results in shadows
that seem less jagged and sharp, making the light source feel more diffuse and
evenly spread out throughout the scene. OpenGL doesn't support this at all.
* The second is that the PICA200 stores depth maps intended for shadow mapping as
plain textures in the RGBA8 format. A lot of games exploit this in order to quickly
convert other types of textures from an internal format to RGBA8. But, OpenGL
stores these maps in a format internal to that graphics card, like any other map.
(RGBA8 or 8bit RGBA is a texture format, which is the combination of an RGB
(red green blue) color model with an extra 4th alpha channel.)
The first point isn't as significant, since the softness can be ignored on OpenGL,
resulting in a very fast (but inaccurate) shadow mapping. Because games rarely
use soft shadows, this can be ignored relatively safely.
The second point though, because games use it very often, it has to be implemented
accurately. The naïve way would be to simply convert internal textures to RGBA8
manually, but this would slow rendering down to a crawl. The smart way would be
to try and trick the graphics card driver into performing a similar conversion,
but such an attempt exposed a lot of issues, leading to instability.
After some very hard work by [wwylele](https://github.com/wwylele), both problems
were solved with a single solution. OpenGL supports an extension called
Image Load/Store, which allows shaders to read and write to any texture
directly. Using this, he created a shader that could accurately implement both
soft shadows, and convert the depth map from its internal format to RGBA8 very
Presence</samp></kbd> and check / uncheck "Show current game in your Discord
status".
## [Set Default values for settings](https://github.com/citra-emu/citra/pull/3924) by [zhaowenlan1779](https://github.com/zhaowenlan1779)
The majority of support requests we get are mostly due to users accidentally
enabling or disabling some settings. But now with this feature, we have
default values for all our settings. This ensures that in case of any new
settings changes, majority of the users (who haven't customized those settings)
will now have the new default value automatically.
## [Add support for encrypted games](https://github.com/citra-emu/citra/pull/4020) by [wwylele](https://github.com/wwylele)
You can now directly use your encrypted game dumps in Citra, without having to
decrypt them. This requires that the user provide their keys via a text file
in `sysdata/aes_keys.txt`.
Currently all known encryption methods are implemented except for the Seed
crypto. Seed crypto is used in newer eshop games, which essentially uses an
additional title-unique key that is stored outside of the ROM.
## [Scripting support](https://github.com/citra-emu/citra/pull/4016) by [EverOddish](https://github.com/EverOddish)
Scripting is an extremely useful feature which allows us to do things like
debugging emulator internals, reverse engineering 3DS game internals,
Tool-Assisted-Speedrunning (TAS), and the ability to manipulate memory in
games. A cheat-like interface could be implemented through this (though, not
specifically Gameshark / AR codes).
Users can make their own scripts or use publicly available scripts to gain
power over things like game screen display, inputs, and memory. Scripts can
also be used to read or modify the internal game state. EverOddish wrote some
scripts that can read internal stats of the Pokémon and automatically
update image files for your current party. This feature is very useful for
streamers who might want to display game information on their streams.
## Movie - game input recording and playback ([#2882](https://github.com/citra-emu/citra/pull/2882), [#3922](https://github.com/citra-emu/citra/pull/3922)) by [danzel](https://github.com/danzel) and [zhaowenlan1779](https://github.com/zhaowenlan1779)
This feature, not to be confused with video/audio recording, implements a way
to record game inputs and play them back. Every time the hardware reads an
input device (buttons, touch screen, accelerometer, gyroscope, c-stick) the
emulator copies (when recording) or replaces (when playing) the values. Once
playback has finished, we release control of inputs so that the user can take
title="System Time setting (edited to show both options)" >}}
Also, players might want to set Citra's time to a specific value to ensure
consistency with TAS or with RNG(random number generator) or for getting
time specific game events. Earlier you had to modify your PC's system time
to achieve this but thanks to B3N30, you can now just set it in Citra's
configuration window.
## [Joystick Hot-plugging](https://github.com/citra-emu/citra/pull/4141) by [B3N30](https://github.com/b3n30)
For a long time, Citra didn't support controller hot plugging. This meant that
if by chance your controller disconnected Citra would fail to detect it after
re-connection, unless you restarted the emulator. This caused a lot of
frustration among users who preferred playing with controllers.
Hot plugging (also called hot swapping) is the ability to add and remove
devices to a computer system while the computer is running and have the
operating system automatically recognize the change.
Thanks to the efforts of B3N30 and [jroweboy](https://github.com/jroweboy)
(who researched SDL controller configuration), Citra now doesn't fail to detect
your controllers in case of a disconnection. However, due to heavy rework of
the existing input configuration code, this requires users to reconfigure their
controllers after updating Citra.
## UDP client to provide motion & touch controls ([#4049](https://github.com/citra-emu/citra/pull/4049), [#4059](https://github.com/citra-emu/citra/pull/4059)) by [jroweboy](https://github.com/jroweboy) and [zhaowenlan1779](https://github.com/zhaowenlan1779)
Citra's previous motion controls were a bit uncomfortable to use. You had to
use your mouse's right-click and drag to tilt the screen, but it was often
hard to figure out where to move the cursor to get the kind of tilt we want.
Using a real device for motion controls is simply much more intuitive and will
be an all around better experience for users. As such, jroweboy set out to
implement cemuhook motion/touch protocol which adds the ability for users to
connect several different devices to citra to send direct motion and touch